> 文档中心 > 兄弟门端午卷一下之线程可见性

兄弟门端午卷一下之线程可见性

兄弟门端午卷一下之线程可见性

首先在这里祝贺大家-端午安康

兄弟门端午卷一下之线程可见性

  • 其实吧在我们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社区贡献一份力量,帮助他人学习,自己也在进步。年轻往前冲。

    以上是我个人了解