五、如何保证可见性
一、第四部分说明了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可见。