Java 中同步的记忆效应
但是,同步不仅仅是相互排斥。同步可确保线程在同步块之前或期间写入的内存以可预测的方式对在同一监视器上同步的其他线程可见。退出同步块后,我们释放监视器,其效果是将缓存刷新到主内存,以便此线程进行的写入可以对其他线程可见。在我们可以进入同步块之前,我们获取监视器,其效果是使本地处理器缓存无效,以便从主内存中重新加载变量。然后,我们将能够看到上一版本显示的所有写入。
我还记得读过,在现代Sun VM上,未经控制的同步很便宜。我对这种说法有点困惑。考虑如下代码:
class Foo {
int x = 1;
int y = 1;
..
synchronized (aLock) {
x = x + 1;
}
}
对 x 的更新需要同步,但是锁的采集是否也从缓存中清除了 y 的值?我无法想象会是这样,因为如果这是真的,像锁条带这样的技术可能无济于事。或者,JVM是否可以可靠地分析代码,以确保y不会使用同一锁在另一个同步块中修改,从而在进入同步块时不会在缓存中转储y的值?