概念
volatile是轻量级同步机制(低配synchronized)
特性
- 内存可见性
- 不保证原子性(n++)
- 禁止指令重排序
内存可见性
要理解内存可见性先得了JMM内存模型(非JVM)
JMM是java并发编程使用的内存模型,是一种规范:
线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。
对一个volatile修饰变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。
原子性
volatile不能保证原子性
n++问题,用javap -c查看n++底层汇编是分成三步,从内存中读取变量->本地内存副本-> add操作-> 刷回内存:
所以在多线程并非下,会出现值覆盖的情况
如何保证原子性?
- synchronized关键字,太重,高射炮打蚊子;
- 可以使用juc包下atomic*类,运用了CAS原理;