线程安全问题 朴灿烈づ我的快乐病毒、 2024-04-20 04:48 103阅读 0赞 ![在这里插入图片描述][ffc0e471ff2144e9aea6a3a99ceb6213.png_pic_center] > 作者简介: zoro-1,目前大二,正在学习Java,数据结构,mysql,javaee等 > 作者主页: [zoro-1的主页][zoro-1] > 欢迎大家点赞 ? 收藏 ⭐ 加关注哦!?? #### 线程安全 #### * 举一个小李子 * * count++在cpu上的指令 * 一次错误的并发执行 * 一次正确的并发执行 * 线程不安全的原因 * 线程安全问题如何解决 * * 锁 * 如何上锁 ## 举一个小李子 ## public class ThreadText2 { static int count = 0; public static void main(String[] args) throws InterruptedException { Object lock = new Object(); Thread thread = new Thread(() -> { for (int i = 0; i < 10000; i++) { count++; } }); Thread thread1 = new Thread(() -> { for (int i = 0; i < 10000; i++) { count++; } }); thread.start(); thread1.start(); thread.join(); thread1.join(); System.out.println(count); } } ![在这里插入图片描述][b303e5b4667c4ba794fa0552a77d7a65.png] > 我们发现上述代码执行的结果居然是14209,按理来说不应该是20000吗,那是因为这里发生了线程安全问题 ### count++在cpu上的指令 ### > load:把内存中的数据加载到寄存器中 > add:进行++计算 > save:把寄存器的值写回内存中 ### 一次错误的并发执行 ### ![在这里插入图片描述][ce44c2a1d60f40798973435a2a9c6f1f.png] > 首先执行左边的load读取count的值,然后执行右边的load读取count的值,然后右面执行add,然后右面执行save,此时内存中的count的值更新为1,然后执行左面add,然后右面执行save,count中的值还是更新为1,相当于两次++操作实则只执行了一次一样 ### 一次正确的并发执行 ### ![在这里插入图片描述][361059b5a38b46bcb155331ec052cb36.png] > 执行左边的load读取count的值,然后左面执行add,然后左面执行save,此时内存中的count的值更新为1,执行右边的load读取count的值1,然后右面执行add,然后右面执行save,此时内存中的count的值更新为2,这样就完美的执行两次了 ## 线程不安全的原因 ## > 1.根本原因:操作系统上的线程是随机调度,“抢占式执行” > 2.代码结构:多个个线程修改同一个变量 > 3.直接原因:count++的操作不是原子性的,执行到一般可能会被调出cpu让其他线程有“可乘之机” ## 线程安全问题如何解决 ## > 针对原因三可以将cpu上的三个指令打包成一个整体,这里就引入了锁的概念 ### 锁 ### 1.特点:具有“互斥”,“排他”性 2.目的:将cpu的指令打包为一个具有原子性的操作,并非完全的原子性 3.**最核心的规则:如果一个线程针对一个对象加上锁后,其他线程也尝试对这个对象加锁,就会产生阻塞(BLOCKED),一直到前一个线程释放锁为止** > 比如:去图书馆占座(上锁),中途想学习(被调度)还是休息(被调走)都行,期间别人不能来,走了(释放锁),比人就可以。。。。。 ### 如何上锁 ### public class ThreadText2 { static int count = 0; public static void main(String[] args) throws InterruptedException { Object lock = new Object(); Thread thread = new Thread(() -> { for (int i = 0; i < 10000; i++) { synchronized (lock) { count++; } } }); Thread thread1 = new Thread(() -> { for (int i = 0; i < 10000; i++) { synchronized (lock) { count++; } } }); thread.start(); thread1.start(); thread.join(); thread1.join(); System.out.println(count); } } ![在这里插入图片描述][e480e03f51be4c3ba916eacf1f376098.png] > > 今天的分享到这里就结束了,感谢大家支持 > > ![在这里插入图片描述][7ee7107a7c334e5b9df389b80c344f0e.png_pic_center] [ffc0e471ff2144e9aea6a3a99ceb6213.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/abbbfa87990c4fe6bca10950bd7f59d5.png [zoro-1]: https://blog.csdn.net/ltzoro?spm=1000.2115.3001.5343 [b303e5b4667c4ba794fa0552a77d7a65.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/919033ff7093427198fef0476cb6ddd0.png [ce44c2a1d60f40798973435a2a9c6f1f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/e5d61df1311245318e9d8cf4076bf0e6.png [361059b5a38b46bcb155331ec052cb36.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/5390f9ef39eb4d3194c2406bc990cdf7.png [e480e03f51be4c3ba916eacf1f376098.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/5ec48eed112c4c4bade3b67536b4a1c3.png [7ee7107a7c334e5b9df389b80c344f0e.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/83edd24f14c64957897f68463edf9c3f.png
相关 线程安全问题 我们把⼀段代码想象成⼀个房间,每个线程就是要进⼊这个房间的⼈。如果没有任何机制保证,A进⼊房间之后,还没有出来;B 是不是也可以进⼊房间,打断 A 在房间⾥的隐私。这个就... 绝地灬酷狼/ 2024年04月23日 20:34/ 0 赞/ 91 阅读
相关 线程安全问题 作者简介: zoro-1,目前大二,正在学习Java,数据结构,mysql,javaee等作者主页:??。 朴灿烈づ我的快乐病毒、/ 2024年04月20日 04:48/ 0 赞/ 104 阅读
相关 线程安全问题 目录 1.不安全原因 1.1线程调度无序(抢占式) 1.2多个线程修改同一个变量 1.3修改操作不是原子的 1.4内存可见性 1.5指令重排序 2.解决问题 2 缺乏、安全感/ 2024年03月25日 18:16/ 0 赞/ 70 阅读
相关 线程安全问题 一、线程安全 VS 线程不安全? 线程安全指的是代码若是串行执行和并发执行的结果完全一致,就称为该代码是线程安全的。 若多个线程串行执行(单线程执行)的结果和并发执行的 短命女/ 2023年10月15日 17:32/ 0 赞/ 77 阅读
相关 线程安全问题 定义 > 首先大家需要思考一下何为线程安全性呢??? 《Java并发编程实战》书中给出定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替 旧城等待,/ 2023年10月01日 19:02/ 0 赞/ 29 阅读
相关 线程安全问题 ![在这里插入图片描述][f9d8ad49a2a449b9888b716a9946db5c.gif_pic_center] 文章目录 一、线程安全问题 二、 逃离我推掉我的手/ 2023年09月27日 13:11/ 0 赞/ 16 阅读
相关 线程安全问题 基本概述: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nL àì夳堔傛蜴生んèń/ 2022年11月29日 12:21/ 0 赞/ 249 阅读
相关 线程安全问题 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污 迷南。/ 2022年08月21日 04:15/ 0 赞/ 272 阅读
相关 线程安全问题 线程安装概念 当多个线程,访问某一个类,对象或者方法时 这个类始终都能表现出正确的行为 那么,这个类,对象或者方法,就是线程安全的 Synchronize 朴灿烈づ我的快乐病毒、/ 2022年05月17日 08:06/ 0 赞/ 293 阅读
相关 线程安全问题 a++造成运行结果错误 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly ╰半橙微兮°/ 2021年09月24日 02:46/ 0 赞/ 463 阅读
还没有评论,来说两句吧...