volatile的特性
- 保证变量对所有线程的可见性,线程总能拿到最新的值;
- 禁止指令重排;
- 对任意单个volatile变量的读/写具有原子性,但是对于类似的volatile++这种复合操作不具有原子性。
volatile的内存语义
- 当写一个 volatile 变量时,JMM 会把该线程对应的本地内存中的共享变量值立即刷新到主内存。
- 当读一个 volatile 变量时,JMM 会把该线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量最新的值。
volatile是如何解决java并发中可见性的问题?
底层是通过 内存屏障 实现的哦,volatile能保证修饰的变量后,可以立即同步回主内存,每次使用前立即先从主内存刷新最新的值。
volatile可以保证原子性吗?
对任意单个volatile变量的读/写具有原子性,但是对于类似的volatile++这种复合操作不具有原子性。
如果要保证原子性,还是要通过synchronized或者Lock来实现。