JSR-133增强volatile的内存语义
JSR-133增强的语义:
对上图的解释:
- 当第二个操作是volatile写时,不管第一个操作是什么,都不允许重排序。这个规则确保volatile写之前的操作不会被编译器重排序到volatile写之后。
- 当第一个操作是volatile读时,不管第二个操作是什么,都不允许重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前。
- 当第一个操作是volatile写、第二个操作是volatile读时,不能重排序。
在JSR-133之前的旧Java内存模型中,虽然不允许volatile变量之间的重排序,但是旧Java内存模型运行volatile变量与普通变量重排序,这样会产生问题。
【🌰栗子】
class VolatileExample { |
在旧的内存模型中,当1和2之间没有数据依赖关系时,1和2之间就可能被重排序(3和4类似)。其结果就是:当线程B在执行4时,不一定能够看到写线程A执行1时的对共享变量的修改。