是否发生之前,即hb(x,y)与hb(y,x)不同?

时间:2016-09-02 01:01:13

标签: java multithreading concurrency java-memory-model happens-before

在查看答案,评论和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不是锁

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

1 个答案:

答案 0 :(得分:0)

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

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