0

我已经阅读了同步块内的代码符合“发生在之前”语义,因此写入同步块内的所有值都应该对其他线程连续可见。此外,我读过缓存仅在同步块终止时刷新。如果仅使用同步块终止刷新缓存,则在下面描述的场景中如何强制执行上述“发生在之前”的语义?

线程 A 引用了对象 C,并在 C 上同步的同步代码中更改了 C 的一个字段。线程 B 也获得了对象 C 的引用。现在线程 A 在同步代码完成之前被挂起。线程 B 开始行动并在代码中访问对象 C 的字段,而 C 上没有同步。

现在是否保证线程 B 可以看到线程 A 所做的更改?

4

2 回答 2

3

重点是线程 B 也应该使用同步块,在与线程 A 相同的监视器上同步。

如果线程 B 没有使用任何同步,则可能会或可能不会看到更改。

于 2010-10-17T07:30:19.750 回答
0

除了现有的答案,请注意,happens-before(X,Y) 仅保证 Y 看到 X 的更新,而不是其他线程会在 Y 的结果之前看到 X 的结果。

(事实上​​,您不需要在同步块内就可以在单个线程内连续操作之间的发生之前的关系。请参阅JLS中 17.4.5 的第一个项目符号。)

于 2010-10-17T08:02:43.250 回答