是否发生在 hb(x,y) 与 hb(y,x) 之前?
is happens before i.e hb(x,y) not same as hb(y,x)?
查看答案、评论和 jls-17.4.2
后可接受的答案
1) 反对称 属性 就像 - user3707125
指出的那样成立
2)锁之间的hb关系其实就是解锁和加锁之间
hb(ul, l) 与 hb(l, ul) 不同。提示 - shmosel
来自 JSL -
An unlock on a monitor happens-before every subsequent lock on that monitor.
3) 以及 james-large 对 hb 的合理解释
实际问题是:
java 记忆模型 (JMM) 描述发生在几个动作之间的关系之前。如果 "x" 和 "y" 是两个动作,它们之间有 h(x,y) 关系。 JMM 还指出,如果实现(编译器、运行 时间或硬件)实现与依次执行 "x" 和 "y" 相同的结果,则它们可以自由地重新排序这些执行。
所以我认为,
hb(x,y) != hb(y,x)
我说的对吗?还是我错过了什么?
更新:
同样对于涉及锁的操作,如何建立 hb 关系。由于不同线程的锁定事件不能由程序顺序定义,因此只是不确定的,取决于指令和调度程序等多种因素
那么在两个锁定动作 - l1 和 l2 之间如何定义关系 hb(l1, l2) 或 hb(l2, l1)。似乎两者都可以接受。在这种情况下,两者似乎相等。
l1 和 l2 是对同一对象的锁定操作。l1 和 l2 不是锁
澄清(基于评论):
当不同线程对同一个对象进行锁定时,锁定操作肯定是互斥的。
是的,允许对操作重新排序,但只能在合理的范围内。在 Java 语言规范 (JLS) 中定义的 发生在 之前的关系专门用于定义可以重新排序的限制。
如果 JLS 说 x 发生在 y 之前,这意味着实现 不允许 进行任何重新排序,这会造成 y 发生在 x 之前的外观。
查看答案、评论和 jls-17.4.2
后可接受的答案1) 反对称 属性 就像 - user3707125
指出的那样成立2)锁之间的hb关系其实就是解锁和加锁之间
hb(ul, l) 与 hb(l, ul) 不同。提示 - shmosel
来自 JSL -
An unlock on a monitor happens-before every subsequent lock on that monitor.
3) 以及 james-large 对 hb 的合理解释
实际问题是:
java 记忆模型 (JMM) 描述发生在几个动作之间的关系之前。如果 "x" 和 "y" 是两个动作,它们之间有 h(x,y) 关系。 JMM 还指出,如果实现(编译器、运行 时间或硬件)实现与依次执行 "x" 和 "y" 相同的结果,则它们可以自由地重新排序这些执行。
所以我认为,
hb(x,y) != hb(y,x)
我说的对吗?还是我错过了什么?
更新:
同样对于涉及锁的操作,如何建立 hb 关系。由于不同线程的锁定事件不能由程序顺序定义,因此只是不确定的,取决于指令和调度程序等多种因素
那么在两个锁定动作 - l1 和 l2 之间如何定义关系 hb(l1, l2) 或 hb(l2, l1)。似乎两者都可以接受。在这种情况下,两者似乎相等。
l1 和 l2 是对同一对象的锁定操作。l1 和 l2 不是锁
澄清(基于评论): 当不同线程对同一个对象进行锁定时,锁定操作肯定是互斥的。
是的,允许对操作重新排序,但只能在合理的范围内。在 Java 语言规范 (JLS) 中定义的 发生在 之前的关系专门用于定义可以重新排序的限制。
如果 JLS 说 x 发生在 y 之前,这意味着实现 不允许 进行任何重新排序,这会造成 y 发生在 x 之前的外观。