首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解JVM发生之前和重新排序

理解JVM发生之前和重新排序
EN

Stack Overflow用户
提问于 2011-07-09 09:38:51
回答 3查看 1.3K关注 0票数 3

我正在阅读关于内存模型的JLS规范,17.4.5发生-订货前。我不明白第一条规则:

"#如果x和y是同一个线程的动作,x按程序顺序放在y之前,则hb(x,y)。“

让我们假设A、A、B是可以在多个线程之间共享的对象(类对象的实例):

代码语言:javascript
复制
int i=A.getNum();  // ActionA
int j=B.getNum();  // ActionB

三个问题:

  1. 根据上述规则,是否指hb(ActionA,ActionB)
  2. 如果1的答案是正确的,那么这是否意味着在遵循ActionB内存模型的JVM中,在遵循JSR133内存模型的任何JVM中,都不能在JSR133之前重新排序?
  3. 如果1和2都是真的,那么ActionA和ActionB似乎不相关,为什么不能重新排序呢?就为了这个规格?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-09 09:45:26

我的理解是:

  1. 你是对的
  2. 它们可以重新排序,但前提是行动B不依赖于行动A的结果。

会发生的--在恋爱关系没有提到任何关于重新排序的行动之前。它只说如果HB( A,B)保持不变,那么动作B必须看到动作A的记忆效果。

如果操作B没有使用操作A的任何结果,那么就没有理由不能重新排序它们。(一般来说,“使用另一个操作的任何结果”相当广泛,它只能用于相当简单的操作,如内存读写,而不能用于使用外部资源的操作,如I/O操作或基于时间的操作)

票数 9
EN

Stack Overflow用户

发布于 2011-07-09 09:49:19

是的,ActionA发生在ActionB之前。不过,请在那一节再读一读。这并不一定意味着JVM不能重新排序这些。这意味着ActionB必须观察ActionA的效果,仅此而已。如果ActionB从来不依赖于ActionA的效果,那就无关紧要了。

票数 3
EN

Stack Overflow用户

发布于 2011-07-09 09:48:53

你的理解基本上是正确的。然而,要记住的关键是:

  • 如果不影响其运行的线程的结果,则允许重新排序
  • 这并不意味着如果影响到其他线程,就不允许重新排序。

这是java多线程编程中常见的错误和困惑的根源。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6633983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档