是否保证代码会跳出 while 循环?
不。Java 内存模型是根据“发生在之前” 关系:
两个操作可以按先行发生关系排序。如果一个操作发生在另一个操作之前,则第一个操作对第二个操作可见并且排序在第二个操作之前。
该规范继续说道:
如果动作 x 与后续动作 y 同步,那么我们也有 hb(x, y)。
where hb
代表发生在之前,并且
监视器 m 上的解锁操作与 m 上的所有后续锁定操作同步(其中“后续”根据同步顺序定义)。
另请注意:
如果 hb(x, y) 和 hb(y, z),则 hb(x, z)。
所以在你的例子中,synchronized(lock)
around b
将为接下来的读取建立一个发生在之前的关系,因此值b
保证在也使用的其他线程中可见synchronized(lock)
。明确地说,
hb(write to b in threadOne, unlock in threadOne) AND
hb(unlock in threadOne, lock in threadTwo) AND
hb(lock in threadTwo, read from a in threadTwo) IMPLIES
hb(write to b in threadOne, read from b in threadTwo)
相似地,a
将保证对其他线程可见。明确地说,
hb(write to a in threadOne, lock in threadOne) AND
hb(lock in threadOne, unlock in threadOne) AND
hb(unlock in threadOne, lock in threadTwo) AND
hb(lock in threadTwo, read a in threadTwo) IMPLIES
hb(write to a in threadOne, read a in threadTwo).
写入然后随后读取c
没有发生在关系之前,因此,根据规范,写入c
不一定可见threadTwo
.
如果我们从方程中删除变量 c 会怎么样?我想知道是否只有 b 保证在 threadTwo 中可见,因为它位于同步块内。
是的,见上文。