同步的行为

时间:2010-10-17 07:27:33

标签: java synchronization java-memory-model

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

线程A具有对象C的引用,并在C上同步的同步代码中更改C的字段。 线程B也有对象C的引用。 现在,线程A在同步代码完成之前被暂停。 线程B跳转到操作并访问代码中的对象C的字段,而C上没有同步。

现在线程B保证看到线程A做出的更改吗?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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

相关问题