最近学习java内存模型过程中接触到了happens-before法则和指令重排,
happens-before第一条为:
同一个线程中的每个Action都happens-before于出现在其后的任何一个Action。
而指令重排的含义是:
Java语言规范规定了JVM线程内部维持顺序化语义,也就是说只要程序的最终结果等同于它在严格的顺序化环境下的结果,那么指令的执行顺序就可能与代码的顺序不一致。这个过程通过叫做指令的重排序。
我的理解是如果发生了指令重排,那么两个动作就有可能发生前后顺序的变化,
这不就和happens-before法则冲突了吗?
麻烦各位大神解惑。
我的理解是这样的,happens-before法则保证的是可见性,而重排序调整的是执行顺序,就是说实际的执行顺序是可能根据重排序调整的,而happens-before是用来根据最后的实际执行顺序来判断两个动作的可见性的法则,它是用来判断可见性而不会影响实际的执行顺序。