程序顺序规则的关键点是: 在线程中 。
想象一下这个简单的程序(所有变量最初为0):
T1:
x = 5;y = 6;
T2:
if (y == 6) System.out.println(x);
从T1的角度来看,执行必须与在x(程序顺序)之后分配的y一致。但是,从T2的角度来看,情况并非一定如此,T2可能会显示0。
实际上,允许T1首先分配y,因为这2个分配是独立的,并且交换它们不会影响T1的执行。
通过正确的同步,T2将始终打印5或什么都不打印。
编辑
您似乎在误解程序顺序的含义。程序顺序规则可以归结为:
如果
x和y是同一个线程的动作和x来之前y在程序顺序,然后hb(x, y)(即x之前发生y)。
__在JMM中, before-before 具有非常特定的含义。特别是,它 不
意味着
y=6必须之后
x=5在T1从挂钟透视。这仅意味着T1执行的操作顺序必须 与 该顺序 一致 。您还可以参考JLS
17.4.5:
应当注意的是,两个动作之间存在先发生关系 并不一定意味着在实现中它们必须以该顺序发生 。如果重新排序产生的结果与合法执行相符,则不合法。
在我上面给出的示例中,您将同意从T1的角度来看(即在单线程程序中)
x=5;y=6;与一致,
y=6;x=5;因为您不读取值。在T1中,保证下一行的语句可以看到这2个动作,而与执行顺序无关。



