兄弟门端午卷一下之线程可见性
首先在这里祝贺大家-端午安康
- 其实吧在我们CSDN也有个习俗,就是写博客,写文章。提升自己从而也帮助了他人
进入正题
分析一下线程可见性
- 举个粒子: 如果线程A改了 变量x的值,x=1。线程2也想去改X的值,发现线程x==1,你也想操作x的值,你想把x的做X++。此时你做打印即可。
首先说一下synchronized可见性
有这么一个规定
- 线程加锁时,清空工作内存中的共享变量,如果你想获取这个共享变量,就直接从主存中读取。
- 线程解锁时,将工作内存中的数据刷新到主存中。
volatile可见性
我来先举个粒子:
线程1boolean stop = false;while(!stop){ something();}线程2修改stop值stop = true;
分析:
- 线程1 一直在哪循环 操作的变量都是 stop 这个。其实把这个线程1 的stop这个变量 一直在工作内存中循环。
- 线程2 虽然改了这个变量 但是也只是在当前线程自己的工作空间中修改的没有刷新到主存中。
jmm是这么说的: - 首先说一下:每个线程都是都有自己的工作内存,每次都会在自己的工作空间(读取和写入)。不同线程之间工作内存中的数据都是隔离的,只有我们把工作内存中的数据写入到主存中,每次访问去从主存中读取。线程中操作共享变量都需要主存来完成
volatile 登场 试试怎么解决
线程1volatile boolean stop = false;while(!stop){ something();}线程2修改stop值stop = true;
- 分析:首先线程1、2 去抢占CPU资源的,谁先抢到谁先执行,并刷新到主存中。线程1,就会立即执行 something();这个方法。
其实线程中 还有 Lock 锁也可以做到 线程可见
- lock 这个锁比较特殊,lock和unlock 是通过volatile来实现的。对共享变量的修改,对其他线程可见。
- Cas ABA问题 原子性 happens-before原则
下一讲我们讲讲锁的分类 挺多的
-
今天呢我们就到这里 一天一篇。未CSDN社区贡献一份力量,帮助他人学习,自己也在进步。年轻往前冲。
以上是我个人了解