问题
- 有序性问题:多线程的环境下,操作系统对指令的重排序可能会导致将一个未初始化的对象引用暴露出来。
- 可见性问题:一个线程修改了共享变量值,而另一个线程却看不到。
原因
- 有序性问题:为了提高执行性能,操作系统对指令的重排序。
- 可见性问题:每个线程拥有自己的一个高速缓存区,操作完不知道何时会写到系统内存。
volatile作用
- 对一个 volatile 域的写,happens-before 于任意后续对这个 volatile 域的读。
- 如果对声明了 volatile 的变量进行写操作,JVM 就会向处理器发送一条 lock 前缀的指令,将这个变量所在缓存行的数据写回到系统内存。
volatile 的实现原理
有序性实现 - happens-before 关系
根据 happens-before 规则,上面过程会建立 3 类 happens-before 关系。
- 根据程序次序规则:1 happens-before 2 且 3 happens-before 4。
- 根据 volatile 规则:2 happens-before 3。
- 根据 happens-before 的传递性规则:1 happens-befor