前言:
volatile关键字通过内存屏障和禁止重排序来优化实现
- 对volatile变量写操作时,会在写操作后加入一条store屏障指令,将本地内存中的共享变量值刷新到主内存
- 对volatile变量读操作时,会在读操作前加入一条load屏障指令,从主内存中读取共享变量
总之:每次对被线程访问时都强迫从主内存中读取该变量的值,而该变量发生变化时,又强迫线程将最新的值刷新回主内存,任何时候线程都能看到最新的值。
volatile关键字有可见性,并没有原子性,这也就是为什么它不用于计数,非要用的话,就要加上Atomic原子类。
它常用的两个功能:
1. 检查某个状态标记以判断是够退出循环
2. 双重检测模式即懒汉模式的单例模式中
一、标记状态
@Slf4j
public class volatileExample {
private volatile static boolean isRunning = true;
private static void shutdown(){
isRunning = false;
System.out.println("关闭了");
}
private static void isStart(String name){
System.out.println("start...");
System.out.println(name);
while(isRunning){}
Sy