查看答案、评论和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 不是锁
澄清(基于评论):当不同线程对同一个对象进行锁定时,锁定动作肯定是互斥的。