Volatile
- 禁止指令重排序
指令重排序:是指CPU允许将多条指令,不按程序规定得顺序,分别发送给各个电路单元
- 线程得可见性
当一个线程修改变量后,新值对其他线程是可以立即得知的。
普通变量的值传递需要通过主内存来完成。
例如,线程A修改普通变量的值,然后向主内存进行回写,另外一条线程B在线程A回写完毕后,新变量值才会对线程B可见。
volatile Test test;
public getSingleTest(){
if(test == null){
synchronized(this.getClass()){
if(test == null){
test = new Test();
}
}
}
}
以典型的双重检查锁机制的单例模式分析。
此处volatile 的作用是:禁止指令重排序 ,避免CPU先执行synchronized代码块(执行加锁操作,影响性能),和线程可见性
单独使用volatile 时后面的操作不能保证原子性,所以要搭配synchronized 锁使用。
单独使用场景
- 确保只有一个线程操作变量,例如线程并发时的shutdown通知。