Volatile理解
Volatile 通过加入内存屏障和禁止重排序优化来实现
1、对volatile变量写操作时,会在写操作后加入一条store屏障命令,将本地内存中的共享变量值刷新到主内存
2、对volatile变量读操作时,会在读操作前加入一条load屏障命令,从主内存中读取共享变量
3、happens-before原则其中之--- volatile变量原则:对一个变量的写操作先行发生与后面对这个变量的读操作
示意图:
应用场景
1、错误场景:
使用volatile 修饰一个计数变量如 privat volatile static int count = 0; 企图通过volatile来实现count++;操作。
count++操做可分解为三步:读到count值,count+1,count写入内存。即volatile不具备原子性
如果多个线程同时读到count,执行了加1操作,再写入,就会出现并发问题。
2、典型应用场景:
应用前题是,对变量的写操作,不依赖当前值。
适合作为状态标记量:
另一种使用场景:双重校验锁
/*
* 双重校验锁
*/
public class SingletonClass2 {
private static volatile SingletonClass2 instance;//声明成 volatile
private SingletonClass2(){
}
public static SingletonClass2 getInstance(){
if(instance == null){
synchronized (SingletonClass2.class) {
if(instance == null){
instance = new SingletonClass2();
}
}
}
return instance;
}
}