Volatie 三重功效
- 64位写入的原子性
- 内存可见性
- 禁止重排序
实现原理
- CPU 缓存一致性协议,多个CPU之间的缓存是同步,不会出现内存可见性问题
- 优化:计算单元和L1缓存之间加了 StoreBuffer、LoadBuffer等
- L1、L2、L3和主存之间是同步的,有缓存一致性协议保证,但是 StoreBuffer、LoadBuffer和L1之间确实异步,也就是说往主存中写入一个变量,这个变量会保存在StoreBuffer里面,稍后才异步地写入L1中,同时同步写入主内存中。
- 如果 A happen-before B,意味着 A 的执行结果必须对B可见,也就是保证跨现成的内存可见性。A happen-before B 不代表 A一定在 B 之前执行。因为,对于多线程而言,两个操作的执行顺序是不确定的。 happen-before 只确保如果 A在 B之前执行,则 A 的执行结果必须对 B 可见。
- 单线程的每个操作,happen-before 于该线程中任意的后续操作
- 对 Volatile 变量的写,happen-before 于后续对这个变量的读
- 对 synchronize 的解锁,happen-before 于后续对这个锁的加锁
- 对 final 变量的写,happen-before 于 final 域对象的读,happen-before 于后续对 final 变量的读
- 实现 Volatile 关键字
- 在 Volatile 写操作前面插入 StoreStore 屏障,保证Volatile写操作不会和之前的写操作重排序
- 在 Volatile 写操作前面插入 StoreLoad 屏障,保证Volatile写操作不会和之后的读操作重排序
- 在 Volatile 读操作后面插入 LoadLoad + LoadStore 屏障,保证Volatile读操作不会和之后的读操作、写操作重排序