- 可以保证元素的可见性(每个线程看到的元素一定是最新值), 不能保证元素的原子性
- 禁止指令重排
如下边的代码
public static long constant = 0;
// public volatile static long constant = 0;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
while (constant == 0) {
long x = constant;
}
System.out.println("constant=" + constant);
}).start();
Thread.sleep(100);
constant = 1;
}
如果不加volatile该程序会发生死循环
见下图
指令重排
Java允许编译器和处理利器进行优化, 这些优化可以与不正确的同步代码交互, 从而产生看似矛盾的行为, 例如下图