引言

Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读的现象,从而保证数据的可见性。

语义

  • 保证了不同线程对这个变量进行操作时的可见性。
  • 禁止进行指令重排序。

happens-before中的volatile

volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。

禁止重排序

通过内存屏障来阻止指令重排序。
JMM内存屏障图:
内存屏障.jpg
volatile重排序规则表(”NO”表示禁止重排序。):
volatile重排序规则表.jpg
策略:

  • 在每个volatile写操作的前面插入一个StoreStore屏障;
  • 在每个volatile写操作的后面插入一个StoreLoad屏障;
  • 在每个volatile读操作的后面插入一个LoadLoad屏障;
  • 在每个volatile读操作的后面插入一个LoadStore屏障。

盗用两张图片来加深理解,来自《java并发编程的艺术》:
volatile写.jpg
volatile读.jpg

参考:

聊聊并发(一)深入分析Volatile的实现原理
内存屏障和 volatile 语义
正确使用 Volatile 变量
彻底理解volatile
Java并发编程:volatile关键字解析