最近学习java内存模型过程中接触到了happens-before法则和指令重排,
happens-before第一条为:
同一个线程中的每个Action都happens-before于出现在其后的任何一个Action。
而指令重排的含义是:
Java语言规范规定了JVM线程内部维持顺序化语义,也就是说只要程序的最终结果等同于它在严格的顺序化环境下的结果,那么指令的执行顺序就可能与代码的顺序不一致。这个过程通过叫做指令的重排序。
我的理解是如果发生了指令重排,那么两个动作就有可能发生前后顺序的变化,
这不就和happens-before法则冲突了吗?
麻烦各位大神解惑。
我的理解是这样的,happens-before法则保证的是可见性,而重排序调整的是执行顺序,就是说实际的执行顺序是可能根据重排序调整的,而happens-before是用来根据最后的实际执行顺序来判断两个动作的可见性的法则,它是用来判断可见性而不会影响实际的执行顺序。
我是这么理解的,hb法则是解决线程间可见性问题的。如果操作A和操作B之间完全没有依赖关系(也就没有可见性要求,不存在数据竞争关系)的时候,是不需要使用hb法则去约束的。比如:
int i=1; //operator A
int j=2; //operator B
操作A和操作B之间没有相互依赖关系,也就是说他们之间完全没有可见性问题,所以他们不需要用hb法则描述,所以对A和B进行重排序不违反hb原则。