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原则。

    评论

报告相同问题?

悬赏问题

  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作