并发-Volatile解读
1. Volatile特性
栈私有本地内存无效,保证读取到的是系统内存。它能保存内存可见性,但是不能保证原子性。
- 可见性:对一个Volatile变量的读,总能看到(任意线程)对这个volatile变量最后的写入;
- 原子性:对任意单个Volatile变量的读/写具有原子性,但类似于Volatile++这种复合操作不具有原子性;
2. Volatile应用场景
如何写入的值不依赖变量当前值,那么就可以使用Volatile。其不具备互斥性,适合一个线程写,其它线程读的场景。
3. 工作内存与主内存之间的交互协议
JAVA内存模型规定工作内存与主内存之间的交互协议,其中包括8种原子操作:
- lock:将主内存中的变量锁定,为一个线程所独占;
- unclock:将lock加的锁定解除,此时其它的线程可以有机会访问此变量;
- read:将主内存中的变量值读到工作内存当中;
- load:将read读取的值保存到工作内存中的变量副本中;
- use:将值传递给线程的代码执行引擎;
- assign:将执行引擎处理返回的值重新赋值给变量副本;
- store:将变量副本的值存储到主内存中;
- write:将store存储的值写入到主内存的共享变量当中;
4.Volatile重排序规则
- 当第二个操作是Volatile写时,无论第一个操作是什么都不能重排序;
- 当第一个操作是Volatile读时,无论第二个操作是什么都不能重排序;
- 当第一个操作是Volatile写,第二个操作是Volatile读时,不能重排序;
5. Volatile内存屏障
- 在每个volatile写操作的前面插入一个StoreStore屏障;
- ·在每个volatile写操作的后面插入一个StoreLoad屏障;
- ·在每个volatile读操作的后面插入一个LoadLoad屏障;
- ·在每个volatile读操作的后面插入一个LoadStore屏障;
参考资料:
【JAVA并发编程的艺术】
【volatile关键字作用与内存可见性、指令重排序概述[JAVA]】
【CPU缓存行】