在查看答案,评论和jls-17.4.2
后,可接受的答案1)反对称属性保持如下 - user3707125
2)锁之间的hb关系实际上是解锁和锁定之间
hb(ul,l)与hb(l,ul)不同。暗示 - shmosel
来自JSL -
监视器上的解锁发生在该监视器上的每次后续锁定之前。
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不是锁
澄清(根据评论): 当不同线程在同一个对象上进行锁定时,锁定动作肯定是互斥的。
答案 0 :(得分:0)
是的,允许实施重新排序操作,但仅限于合理的限制范围内。 发生在Java语言规范(JLS)中定义的关系之前,专门用于定义可以重新排序的限制。
如果JLS说x发生在y之前,这意味着实现不允许进行任何重新排序,这会在x之前产生y的外观。