一:可见性
java的内存模型如上图所示
当一个变量被volatile修饰时,保证了这个变量对所有Java线程的可见性。
(1)可见性指什么
指一个线程修改了变量的值后,新的值对其它的Java线程都是可以立即得知的。
(2)如何做的
- 在各个Java线程中volatile变量可以存在不一致的情况。
- 但是每次读操作都要先刷新,从主内存中获取最新的值。
- 每个Java线程写操作后会立即刷新到主内存,非volatile变量不会立即刷新到主内存。
(3)volatile并不能保证线程安全性
二:禁止指令重排序
(1)示例
volatile boolean initialized = false;
A线程:
- 初始化操作(和initialized没有关系)
- initialized = true;
B线程:
while(!initialized) {
sleep();
}
doSomeThings();
(2)分析
如果initialized没有被volatile修饰,那么由于指令重排序,A线程中的第二步可能在第一步前先执行。
这样B线程认为初始化已经完成,可能会导致一些问题。
三:什么时候使用
(1)多个线程需要同时访问来保持可见性
(2)指令重排序可以优化代码,而volatile避免了指令重排序,会导致效率降低。
本文暂时没有评论,来添加一个吧(●'◡'●)