zlm735895149 2013-08-30 00:45 采纳率: 0%
浏览 2179

happens-before法则和指令重排是否矛盾

最近学习java内存模型过程中接触到了happens-before法则和指令重排,
happens-before第一条为:
同一个线程中的每个Action都happens-before于出现在其后的任何一个Action。
而指令重排的含义是:
Java语言规范规定了JVM线程内部维持顺序化语义,也就是说只要程序的最终结果等同于它在严格的顺序化环境下的结果,那么指令的执行顺序就可能与代码的顺序不一致。这个过程通过叫做指令的重排序。

我的理解是如果发生了指令重排,那么两个动作就有可能发生前后顺序的变化,
这不就和happens-before法则冲突了吗?
麻烦各位大神解惑。

我的理解是这样的,happens-before法则保证的是可见性,而重排序调整的是执行顺序,就是说实际的执行顺序是可能根据重排序调整的,而happens-before是用来根据最后的实际执行顺序来判断两个动作的可见性的法则,它是用来判断可见性而不会影响实际的执行顺序。

  • 写回答

1条回答 默认 最新

  • 奇横 2016-05-23 06:13
    关注

    我是这么理解的,hb法则是解决线程间可见性问题的。如果操作A和操作B之间完全没有依赖关系(也就没有可见性要求,不存在数据竞争关系)的时候,是不需要使用hb法则去约束的。比如:
    int i=1; //operator A
    int j=2; //operator B
    操作A和操作B之间没有相互依赖关系,也就是说他们之间完全没有可见性问题,所以他们不需要用hb法则描述,所以对A和B进行重排序不违反hb原则。

    评论

报告相同问题?

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程