JVM学习之路(五)——如何保证可见性

JVM学习之路(一)——java程序执行流程

JVM学习之路(二)——JVM的内部结构

JVM学习之路(三)——JVM内部结构详细介绍及其相互作用

JVM学习之路(四)——内存模型(java多线程通信)

五、如何保证可见性

一、第四部分说明了java线程之间通信的流程,以及各自的工作内存和共享的主内存在JMM(Java 内存模型)的管理下的工作流程。在这个工作流程中,发现了一个比较严重的问题——变量的不可见性(顾名思义,一个线程看不见另一个线程对变量所做的改变,还傻了吧唧的使用原来旧的值,可不就是“不可见”嘛)。这是由于“工作内存”这个中间层的出现,线程1和线程2必然存在延迟的问题,具体体现在以下2种情况:

1、线程1在工作内存中更新了变量,但还没刷新到主内存,而此时线程2只能获取到未更新的原来旧的变量值。

2、线程1成功将变量更新到主内存,但线程2依然使用自己工作内存中原来旧的变量值,并没有去主内存取新的值。

不管出现哪种情况,都可能导致线程间的通信不能达到预期的目的。那有没有解决办法呢?Of course,这就是volatile关键字的作用所在。

二、volatile如何打破僵局?

Volatile保证两件事:

1、 针对上述第1种情况,使用volatile就要求线程1工作内存中的变量更新强制立即写入到主内存

2、 针对上述第2种情况,使用volatile就要求线程2工作内存中的变量会强制立即失效,这使得线程2必须去主内存中获取最新的变量值。

所以,这就是volatile保证变量可见性的原理。这样的话,线程1对变量的修改就能第一时间让线程2可见。

猜你喜欢

转载自blog.csdn.net/u012556994/article/details/81262237
今日推荐