并发-Volatile解读

1. Volatile特性

栈私有本地内存无效,保证读取到的是系统内存。它能保存内存可见性,但是不能保证原子性。

  • 可见性:对一个Volatile变量的读,总能看到(任意线程)对这个volatile变量最后的写入;
  • 原子性:对任意单个Volatile变量的读/写具有原子性,但类似于Volatile++这种复合操作不具有原子性;

2. Volatile应用场景

如何写入的值不依赖变量当前值,那么就可以使用Volatile。其不具备互斥性,适合一个线程写,其它线程读的场景。

3. 工作内存与主内存之间的交互协议

JAVA内存模型规定工作内存与主内存之间的交互协议,其中包括8种原子操作:

  • lock:将主内存中的变量锁定,为一个线程所独占;
  • unclock:将lock加的锁定解除,此时其它的线程可以有机会访问此变量;
  • read:将主内存中的变量值读到工作内存当中;
  • load:将read读取的值保存到工作内存中的变量副本中;
  • use:将值传递给线程的代码执行引擎;
  • assign:将执行引擎处理返回的值重新赋值给变量副本;
  • store:将变量副本的值存储到主内存中;
  • write:将store存储的值写入到主内存的共享变量当中;

并发-Volatile解读

4.Volatile重排序规则

并发-Volatile解读

  • 当第二个操作是Volatile写时,无论第一个操作是什么都不能重排序;
  • 当第一个操作是Volatile读时,无论第二个操作是什么都不能重排序;
  • 当第一个操作是Volatile写,第二个操作是Volatile读时,不能重排序;

5. Volatile内存屏障

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

参考资料:

【JAVA并发编程的艺术】

volatile的指令重排序理解

volatile关键字作用与内存可见性、指令重排序概述[JAVA]

volatile禁止重排序详解

聊聊并发(一)深入分析Volatile的实现原理

CPU缓存行