-2

查看答案、评论和jls-17.4.2后可接受的答案

1) 反对称性质成立,如 - user3707125 所指

2) 锁之间的hb关系实际上是解锁和加锁hb(ul, l)之间的关系,与hb(l, ul)不同。
提示 -来自 JSL的 shmosel -

监视器上的解锁发生在该监视器上的每个后续锁定之前。

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 不是锁

澄清(基于评论):当不同线程对同一个对象进行锁定时,锁定动作肯定是互斥的。

4

1 回答 1

0

是的,允许实现重新排序操作,但只能在合理的范围内。Java 语言规范 (JLS) 中定义的发生在关系之前专门用于定义可以重新排序的限制。

如果 JLS 说 x 发生在 y 之前,这意味着不允许实现进行任何可能导致 y 出现在 x 之前的外观的重新排序。

于 2016-09-02T11:28:51.890 回答