volatile
Java虚拟机提供的轻量级的同步机制
- 保证可见性
- 禁止指令重排
- 不保证原子性
为什么说是轻量级的同步机制呢,因为它保证不了原子性,这就违背了JMM中同步机制机制。
volatile实现禁止指令重排,从而避免了多线程环境下程序出现乱序执行的现象,Java里面使用内存屏障实现指令重排。
内存屏障(Memory Barrier)又称内存栅栏,是一个CPU指令,保证指令重排,他的作用有两个:
- 保证特定操作的执行顺序
- 保证某些变量的内存可见性(利用该特性实现volatile的内存可见性)
JMM(Java Memory Model)
- 可见性
- 原子性
- 有序性
线程解锁前,必须把共享变量刷回主存
线程加锁前,必须读取内存的最新值到自己的工作内存
加锁和解锁必须是同一把锁
image.png
多线程情况下是,volatile并不能保证程序的正确性,因为它不保证原子性。
如果我们要对volatile的变量进行操作是,可以加synchronized使线程安全,但这可能有点大材小用了。
我们应该要想到的是java.util.concurrent.atomic包下的类来对我们操作的元素进行原子性操作。