下面的java程序将如何运行&引用;发生在“之前”;订单示例?

下面的java程序将如何运行&引用;发生在“之前”;订单示例?,java,Java,请参阅JLS中的以下程序 本节末尾对程序进行了说明: 我可以理解r1是1,但r2的值是多少。x的写入是否发生在r2对x的读取使r2=1之前 由于x未同步,它可能在本地内存中,r2可能为0??我不清楚订单前发生的事件的影响 根据(如果hb(x,y)和hb(y,z),那么hb(x,z)),我们有hb(x=1,y=1),hb(y=1,r1=y),hb(r1=y,r2=x),前面的hb(x=1,r2=x)。所以r2=1。根据规则#1:如果x和y是同一线程的动作,并且x按程序顺序排在y之前,那么hb(

请参阅JLS中的以下程序

本节末尾对程序进行了说明:

我可以理解r1是1,但r2的值是多少。x的写入是否发生在r2对x的读取使r2=1之前


由于x未同步,它可能在本地内存中,r2可能为0??我不清楚订单前发生的事件的影响

根据(如果hb(x,y)和hb(y,z),那么hb(x,z)),我们有hb(x=1,y=1),hb(y=1,r1=y),hb(r1=y,r2=x),前面的hb(x=1,r2=x)。所以r2=1。

根据规则#1:如果x和y是同一线程的动作,并且x按程序顺序排在y之前,那么hb(x,y)。如果你看,你可以看到发生重新排序的情况。如果线程2首先获得锁,我发现了原来的规则:如果x和y是同一个线程的动作,并且x在程序顺序中位于y之前,那么hb(x,y)。我的问题是,如果它像这样运行,x=1和y=1会重新排序吗?我找不到任何他们不能重新订购的规则。好的,看起来即使在这种情况下重新排序,结果也是一样的。因此,重新排序与“之前发生”无关?以下解释:-------------应该注意的是,两个操作之间存在“之前发生”关系并不一定意味着它们必须在实现中按该顺序发生。如果重新排序产生的结果与合法执行一致,那么它并不违法。-------------因此,似乎顺序并不重要。所以这意味着,即使在实际的程序运行时,在运行时也可能是“y=1”在“x=1”之前运行。但这种重新排序并不会改变结果