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