位置: IT常识 - 正文

多线程的风险 --- 线程安全(多线程的弊端)

编辑:rootadmin
多线程的风险 --- 线程安全

推荐整理分享多线程的风险 --- 线程安全(多线程的弊端),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:多线程的风险,多线程处理方式,多线程的弊端,多线程可能出现的问题,多线程可能出现的问题,多线程的风险,多线程的风险,多线程的风险,内容如对您有帮助,希望把文章链接给更多的朋友!

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 ✨每日一语:低头赶路,敬事如仪;自知自心,其路则明。

目 录

🍸一. 线程不安全🍹二. 线程不安全的原因🍸一. 线程不安全

多线程编程,最重要,也是最困难的问题就是线程安全问题,它的万恶之源,罪魁祸首就是调度器的随机调度 / 抢占式执行 这个过程

线程不安全:在随机调度之下,程序执行有多种可能,其中的某些可能导致代码出现了 bug ,线程不安全 / 线程安全问题

例如:两个线程对一个变量进行并发的自增(创建俩线程,让这俩线程同时并发的对一个变量,自增 5w 次,最终预期能一共自增 10w 次)

//创建俩线程,让这俩线程同时并发的对一个变量,自增 5w 次,最终预期能一共自增 10w 次class Counter{ //用来保存计数的变量 public int count; public void increase(){ count++; }}public class Demo14 { //这个实例用来进行累加 public static Counter counter = new Counter(); public static void main(String[] args) { Thread t1 = new Thread(()->{ for (int i = 0; i < 50000; i++) { counter.increase(); } }); Thread t2 = new Thread(()->{ for (int i = 0; i < 50000; i++) { counter.increase(); } }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("count: " + counter.count); }}

运行结果:

再运行一次:

发现随机调度顺序不一样,结果也就不一样

那上面的 bug 如何出现的?

执行一段代码,需要让 CPU 把对应的指令从内存中读取出来,然后再执行   像 count++ 一行代码,对应三个机器指令

1.从内存读取数据到 CPU(load)2.在 CPU 寄存器中,完成加法运算(add)3.把寄存器的数据写回到内存中(sava)多线程的风险 --- 线程安全(多线程的弊端)

指令的排序方式:

上述两种指令的排序方式恰好能到 2 。但是还有许许多多的排列组合方式,就都不一定了。

此时总和就是 1 了

这些还有许许多多就不在此举例了

根据上述的总结,俩种极端情况就是 5w 和 10w 。然后其他的情况就是 5w 和 10w 之间了。

拓展:

操作系统中的随机调度严格意义上来说其实不是 “随机调度” 。在内部他有自己的一套调度过程,我们不需要理解这个过程,了解了也无法改变这个调度。

🍹二. 线程不安全的原因

1. 操作系统的随机调度 / 抢占式执行。【罪魁祸首,万恶之源】 2. 多个线程修改同一个变量。【三个条件缺一不可,别的情况都没事儿】(所以写代码中可以针对这三个点进行改变进行规避,但是范围有限,不是所有的场景都可以规避掉) 3. 有些修改操作,不是原子的!【不可拆分的最小单位,就叫原子】

通过 = 来修改,= 只对应一条机器指令,视为是原子的 通过 ++ 来修改,++ 对应三条机器指令,则不是原子的

什么是原子性?   我们把一段代码想象成一个房间,每个线程就是要进入这个房间的人。如果没有任何机制保证,A进入房间之后,还没有出来;B 是不是也可以进入房间,打断 A 在房间里的隐私。这个就是不具备原子性的。   那我们应该如何解决这个问题呢?是不是只要给房间加一把锁,A 进去就把门锁上,其他人是不是就进不来了。这样就保证了这段代码的原子性了。(后续详解关于锁)   后果:如果一个线程正在对一个变量操作,中途其他线程插入进来了,如果这个操作被打断了,结果就可能是错误的。

4. 内存可见性,引起的线程安全问题。【内存改了,但是在优化的背景下,读不到看不见】

例如一个线程读,一个线程修改:线程 1 LOAD 之后需要进行 TEST ,然后继续 LOAD 再继续 TEST ,这样循环走下去,但是,在程序运行过程中,可能会涉及到一个操作 “优化” (可能是编译器 Javac,也可能是 JVM Java,也可能是操作系统),由于 LOAD 读的操作太慢,反复读,每次读到的数据都是一样的,JVM 就对此做出了优化,不需要重复在内存中读取了,直接就重复用第一次从内存读到寄存器的数据就好了,此时在优化之后,线程 2 突然写了一个数据,由于线程 1 已经优化成读寄存器了,因此线程 2 的修改线程 1 感知不到。   上述优化在单线程环境下没问题,但是多线程情况下就可能产生问题,多线程环境太复杂,编译器/JVM/操作系统进行优化的时候就可能产生误判!!!针对这个问题,Java 引入了 volatile 关键字,让程序猿手动禁止编译器针对某个变量进行上述优化!

5. 指令重排序。【调整代码执行顺序】

也是编译器 / JVM / 操作系统优化   优化在单线程环境下没问题,但是多线程情况下就可能产生问题,例如 Test t = new Test(); 在底层就有三个步骤:

创建内存空间往这个内存空间上构造一个对象把这个内存的引用赋值给 t

  此处就容易出现指令重排序引入的问题,2 和 3 的顺序是可以调换的,在单线程下调换这俩是没影响的,多线程下就不行了。例如我们俩线程,第一个线程按照先 2 后 3 的顺序,另一个线程尝试读取 t 的引用,当第二个线程读到 t 为非 null 的时候,此时 t 就一定是一个有效对象!!!如果是按照先 3 后 2 的顺序,第二个线程读到 t 为非 null 的时候,仍然可能是一个无效对象!!!

本文链接地址:https://www.jiuchutong.com/zhishi/298553.html 转载请保留说明!

上一篇:蓝桥杯第十四届蓝桥杯模拟赛第三期考场应对攻略(C/C++)(蓝桥杯第十四届模拟赛第三期)

下一篇:uni-app--》如何制作一个APP并使用?(uni-app编译)

  • vivo手机收到消息不显示内容(vivo手机收到消息为什么会震动)

    vivo手机收到消息不显示内容(vivo手机收到消息为什么会震动)

  • qq停留多久算浏览者(qq多久不看会显示离线请留言)

    qq停留多久算浏览者(qq多久不看会显示离线请留言)

  • 快手邀请新用户的奖励可以提现吗(快手邀请新用户邀请码在哪里填)

    快手邀请新用户的奖励可以提现吗(快手邀请新用户邀请码在哪里填)

  • 腾讯登录qq闪退(腾讯用qq登录就闪退)

    腾讯登录qq闪退(腾讯用qq登录就闪退)

  • 打对方电话一直占线(拨打对方电话总是说忙)

    打对方电话一直占线(拨打对方电话总是说忙)

  • 超级qq为什么没有了(超级qq在哪里)

    超级qq为什么没有了(超级qq在哪里)

  • iPhone11要不要快充

    iPhone11要不要快充

  • 酷狗歌词怎么只有两行(酷狗歌词怎么只播放一半)

    酷狗歌词怎么只有两行(酷狗歌词怎么只播放一半)

  • 华为荣耀9xpro怎么截屏(华为荣耀9Xpro怎么把手机号码导入卡里)

    华为荣耀9xpro怎么截屏(华为荣耀9Xpro怎么把手机号码导入卡里)

  • 手机录屏能录多久(手机录屏最多可以录多少分钟)

    手机录屏能录多久(手机录屏最多可以录多少分钟)

  • 苹果手表怎么配对华为(苹果手表怎么配对vivo的手机)

    苹果手表怎么配对华为(苹果手表怎么配对vivo的手机)

  • 水滴屏的缺陷(水滴屏的缺陷怎么修复)

    水滴屏的缺陷(水滴屏的缺陷怎么修复)

  • 腾讯会议有32位的吗(腾讯会议32位安装包)

    腾讯会议有32位的吗(腾讯会议32位安装包)

  • qqvip怎么升级到vip2(qqvlp怎么升级)

    qqvip怎么升级到vip2(qqvlp怎么升级)

  • scada系统包含什么系统

    scada系统包含什么系统

  • 二代笔配什么型号ipad(二代笔要买笔套吗)

    二代笔配什么型号ipad(二代笔要买笔套吗)

  • 小米手机手势设置在哪里(小米手机手势设置)

    小米手机手势设置在哪里(小米手机手势设置)

  • 苹果账号被禁用无法更新app(苹果账号被禁用没有重设怎么办)

    苹果账号被禁用无法更新app(苹果账号被禁用没有重设怎么办)

  • g2020配什么主板(英特尔x79主板多少钱)

    g2020配什么主板(英特尔x79主板多少钱)

  • iphonex面容坏了能修吗(iphonex面容坏了摄像头就坏了吗)

    iphonex面容坏了能修吗(iphonex面容坏了摄像头就坏了吗)

  • 手机用久了为什么会卡(手机用久了为什么充不进电怎么办)

    手机用久了为什么会卡(手机用久了为什么充不进电怎么办)

  • 金立的故事锁屏怎么取消(金立的故事锁屏怎么关闭)

    金立的故事锁屏怎么取消(金立的故事锁屏怎么关闭)

  • 小天才z5参数(小天才Z5参数对比Q1A)

    小天才z5参数(小天才Z5参数对比Q1A)

  • 如何查找未保存的ppt文件(如何查找未保存的微信群)

    如何查找未保存的ppt文件(如何查找未保存的微信群)

  • qq解封上限5次怎么办(qq解封上限5次怎么解封)

    qq解封上限5次怎么办(qq解封上限5次怎么解封)

  • 手机丢了绑定的银行卡怎么办(手机丢了绑定的东西怎么办)

    手机丢了绑定的银行卡怎么办(手机丢了绑定的东西怎么办)

  • 趣店免密支付是什么(趣店不用还)

    趣店免密支付是什么(趣店不用还)

  • qq的消息提示音没了怎么办(以前qq的消息提示音)

    qq的消息提示音没了怎么办(以前qq的消息提示音)

  • 爱奇艺视频怎么下载到手机相册(爱奇艺视频怎么剪辑一段)

    爱奇艺视频怎么下载到手机相册(爱奇艺视频怎么剪辑一段)

  • 华为mate20pro和华为p30pro对比(华为mate20pro和华为mate50pro对比)

    华为mate20pro和华为p30pro对比(华为mate20pro和华为mate50pro对比)

  • iotop命令  监视磁盘I/O状态

    iotop命令 监视磁盘I/O状态

  • 向下递归以及向上递归(递归是从底向上逐层计算的)

    向下递归以及向上递归(递归是从底向上逐层计算的)

  • 个体工商户可以开发票吗
  • 增值税留抵退税是什么意思
  • 房产税的计算公式是多少
  • 专票要写开户行和账号
  • 金税四期对个人所得税的影响
  • 为改良生产线发生的变化
  • 咨询费开发票选哪一项
  • 变更了公司名称以前的发票还可以抵扣吗
  • 税金及附加包括个人所得税吗
  • 土地租金计入哪个会计科目
  • 管理费抵扣如何计算
  • 清算资金往来借贷方什么意思
  • 标书费收据丢失怎么办
  • 股权转让的违约条款
  • 存货的进项税要计入成本吗
  • 普通发票年份代码有什么具体含义?
  • 企业年报最容易掉进的九大“陷阱”
  • 技术服务费属于什么税收分类编码
  • 外地项目预缴个人所得税
  • 个体户要申报
  • 建筑服务安装费发票需要备注什么
  • 以前年度损益结转到什么科目
  • 商品进销差价的核算方法
  • 公司负担劳务费的个税如何做分录
  • 研发阶段计入管理费用吗吗
  • 租入固定资产装修
  • 年度中间符合小数怎么算
  • 采用赊销方式销售货物的纳税义务发生时间
  • 代销商品手续费计入什么科目
  • 公司卖二手车的流程
  • 销售产品出去 怎么做科目
  • realjbox.exe - realjbox是什么进程 作用是什么
  • 劳务的完成程度可以采用如下方法确定
  • pos机未入账怎么回事
  • 办理发票缴销需要提供的资料
  • 最贵的游戏宣传片
  • 挪威最北部
  • php是面向对象编程吗
  • thinkphp技巧
  • php绘制图片
  • vue axios 拦截器
  • vuev-for循环k值的意义
  • 【深度学习】模型过拟合的原因以及解决办法
  • unzip解压命令参数
  • python按行读入
  • wordpress图片模板
  • 维修费的会计分录怎么写
  • 企业公章的使用和管理规定
  • 施工营业额是什么意思
  • 当月已付款, 没收到发票怎么做账
  • 被冲红发票怎么处理
  • 子公司可以吸收母公司吗
  • 分成收入计入什么科目
  • 城市维护建设税,教育费附加,地方教育费附加
  • 预付款 退
  • 定额转查账征收
  • 个贷系统平账专户A户付款会计分录
  • 企业提取盈余公积的比例
  • 贴现汇票到期收回时
  • 会计账簿按用途分类分为
  • 补记式余额调节法怎么写项目
  • 确认收入一定要交增值税吗
  • 建账需要买哪些会计用品
  • mysql的三种查询方式
  • linux监控软件zabbix
  • win 10系统怎么查看网络连接
  • 消除类策略游戏
  • [置顶] clauvio,Twitter小老鼠
  • 批处理/l
  • 批处理在windows中的典型应用
  • margin-left auto
  • javascript定律
  • jquery中each()方法的作用及使用
  • python中scipy.stats
  • 回购房 安置房
  • 从价计征和从租计征的区别,有什么优缺点
  • 知道金额,税额怎么计算
  • 年度汇算清缴计算
  • 发票开具显示获取纳税人基础信息失败,请退出?
  • 税票电话号码变更影响抵扣吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设