位置: 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编译)

  • 微信营销:微信营销慎重操作,微信营销要注意些什么(微信营销微信广告和朋友圈的看法)

    微信营销:微信营销慎重操作,微信营销要注意些什么(微信营销微信广告和朋友圈的看法)

  • 钉钉群里没有我在本群的昵称怎么改(钉钉群里没有我的昵称怎么改)

    钉钉群里没有我在本群的昵称怎么改(钉钉群里没有我的昵称怎么改)

  • 华为nova电量百分比怎么设置(华为手机nova电池容量)

    华为nova电量百分比怎么设置(华为手机nova电池容量)

  • 笔记本可以装几个硬盘(笔记本可以装几条固态)

    笔记本可以装几个硬盘(笔记本可以装几条固态)

  • 用一键锁屏的坏处(一键锁屏对手机好不好)

    用一键锁屏的坏处(一键锁屏对手机好不好)

  • 华为手机隐藏共享热点(华为手机隐藏共享设备)

    华为手机隐藏共享热点(华为手机隐藏共享设备)

  • 手机屏幕出现hd是什么意思(手机屏幕出现HD怎么办)

    手机屏幕出现hd是什么意思(手机屏幕出现HD怎么办)

  • vivo手机充电发热很烫 怎么办(vivo手机充电发热发烫正常吗)

    vivo手机充电发热很烫 怎么办(vivo手机充电发热发烫正常吗)

  • 苹果7死机屏幕无反应(苹果死机屏幕无反应什么原因)

    苹果7死机屏幕无反应(苹果死机屏幕无反应什么原因)

  • 一线屏显示器是什么意思(显示器一线和二线品牌区别)

    一线屏显示器是什么意思(显示器一线和二线品牌区别)

  • ipada1670是什么型号(ipada1673是什么型号)

    ipada1670是什么型号(ipada1673是什么型号)

  • 快手评论上限多久恢复(快手评论多少条才算上限)

    快手评论上限多久恢复(快手评论多少条才算上限)

  • 显示器typec接口有啥用

    显示器typec接口有啥用

  • 怎么把qq昵称弄成彩色(怎么设置qq昵称并...)

    怎么把qq昵称弄成彩色(怎么设置qq昵称并...)

  • 荣耀20后台怎么清理

    荣耀20后台怎么清理

  • 苹果xr和苹果11的屏幕大小(苹果xr和苹果11哪个好)

    苹果xr和苹果11的屏幕大小(苹果xr和苹果11哪个好)

  • 库乐队里的歌怎么删除(库乐队里的歌怎么发给别人)

    库乐队里的歌怎么删除(库乐队里的歌怎么发给别人)

  • iphonex有没有3dtouch

    iphonex有没有3dtouch

  • xs港版支持中国电信吗(xs港版支持电信吗)

    xs港版支持中国电信吗(xs港版支持电信吗)

  • ios12.4正式版发布时间(苹果发布ios12.5)

    ios12.4正式版发布时间(苹果发布ios12.5)

  • airpods 防水吗  (airpods防水吗 流汗)

    airpods 防水吗 (airpods防水吗 流汗)

  • 叮咚mini2怎么给电脑当音响(叮咚mini2怎么语音唤醒)

    叮咚mini2怎么给电脑当音响(叮咚mini2怎么语音唤醒)

  • it是什么职业(it啥职业)

    it是什么职业(it啥职业)

  • BascsTray.exe进程是什么文件产生的 BascsTray进程信息查询(bassmod.dll)

    BascsTray.exe进程是什么文件产生的 BascsTray进程信息查询(bassmod.dll)

  • 无花果的功效与作用及食用吃法(无花果的功效与作用对女人的好处)

    无花果的功效与作用及食用吃法(无花果的功效与作用对女人的好处)

  • 微信小程序---分包操作(微信小程序分成比例)

    微信小程序---分包操作(微信小程序分成比例)

  • CSS实现: 水平居中 的几种方法(css水平居中和垂直居中怎么设置)

    CSS实现: 水平居中 的几种方法(css水平居中和垂直居中怎么设置)

  • 组成计税价应该是含税价还是不含税价?
  • 房地产企业递延所得税资产计算方法
  • 盈利能力也可以反映短期偿债能力
  • 企业所得税年报怎么查询
  • 废铁回收行业前景怎么样
  • 异常凭证进项税额转出
  • 发票专用章盖在收据上有法律效益
  • 开具红字增值税专用发票是什么意思
  • 金融利息是什么意思
  • 个体工商户如何注册
  • 固定资产属于净资产的哪一项
  • 工地用材料如何分类
  • 招待住宿费计入什么科目
  • 税控系统维护费账务处理
  • 已经使用的固定资产其变动方式等基础资料将
  • 营改增后房地产公司税种及税率
  • 个体户没有三证合一,年检
  • 水利基金减免政策2022
  • 销售折让的税收分类编码
  • 企业固定资产的盘亏净损失
  • 房地产公司靠什么赚钱
  • 待认证发票后面需要做附件吗
  • 银行存款二级科目怎么增加
  • 家具螺丝螺母一般在哪里卖
  • 少计提的地税怎么做分录
  • 2021工资扣税标准公式
  • windows7为什么不能用了
  • 发生利息收入的分录
  • 代收消费税计算
  • Mac OS X Mavericks的Finder打开不同标签的操作步骤
  • php字符串定义的三种方式
  • 实缴注册资本股权转让怎么交税
  • win10商店发生了错误请稍后再试
  • 公司中奖要交税吗
  • 红字增值税专用发票信息表怎么填
  • 黑色金属冶炼压延品的税收编码是多少
  • 一键部署源码
  • 日期按钮
  • 微擎框架安装教程
  • 非事业单位企业退休年龄
  • linux 静态链接
  • mysql安装配置教程csdn
  • python文件可分为哪几类
  • 新公司财务需要哪些东西
  • 水电费进项税额转出情形
  • 普票要盖发票的章子吗
  • sqldbmon
  • sqlserver FOR XML PATH 语句的应用
  • 销售原材料的差价怎么算
  • 出口货物预收账款分录
  • 小企业附加税减免政策
  • 政府补助收入是指
  • 建筑单位工伤缴费标准
  • 暂估入库产品销售结转成本
  • 应发工资应税工资
  • 发票章摔坏了一个角,还能盖吗
  • 免税收入包括哪些项目
  • 医院药品过期放多久
  • mysql数据库sid
  • mysql内存占用一直增高不释放
  • sql server数据库查询语句
  • 简述操作系统更新设置方法
  • linux的tar命令详解
  • win7系统如何删除隐藏文件
  • win7系统如何卸载office2007
  • Linux httpd(apache)启动失败 解决办法
  • win7更新8007000e
  • android开发webview
  • perl-dbd-mysql是什么
  • 用python做逻辑回归
  • 编写一个python函数is_multiple
  • ThreadPool.RegisterWaitForSingleObject 设置等待超时事件
  • jquery弹出框样式大全
  • libgdx robovm admob IOS SDK的绑定
  • 使用SQLite数据库保存和处理数据
  • SublimeText自带格式化代码功能之reindent
  • jquery技巧
  • 10086出现预警提示怎么回事
  • 电脑有网为什么不能用
  • 香水与香精有啥不一样
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设