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;
}
}
本文详细解析了Java中的Volatile关键字的工作原理及其应用场景。介绍了Volatile如何通过内存屏障和禁止重排序来确保可见性和有序性,并强调了它不保证原子性的特点。最后通过双重校验锁的示例展示了Volatile的正确使用方式。

6459

被折叠的 条评论
为什么被折叠?



