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 可见
    1. 单线程的每个操作,happen-before 于该线程中任意的后续操作
    2. 对 Volatile 变量的写,happen-before 于后续对这个变量的读
    3. 对 synchronize 的解锁,happen-before 于后续对这个锁的加锁
    4. 对 final 变量的写,happen-before 于 final 域对象的读,happen-before 于后续对 final 变量的读
  • 实现 Volatile 关键字
    1. 在 Volatile 写操作前面插入 StoreStore 屏障,保证Volatile写操作不会和之前的写操作重排序
    2. 在 Volatile 写操作前面插入 StoreLoad 屏障,保证Volatile写操作不会和之后的读操作重排序
    3. 在 Volatile 读操作后面插入 LoadLoad + LoadStore 屏障,保证Volatile读操作不会和之后的读操作、写操作重排序