JSR-133 FAQ表示:
但是同步不仅仅意味着互斥。同步确保线程在同步块之前或期间写入的内存对于在同一监视器上同步的其他线程以可预测的方式可见。在我们退出同步块后,我们会释放监视器,这会刷新缓存到主内存中,使得该线程进行的写入可以对其他线程可见。在进入同步块之前,我们需要获取监视器,这会使本地处理器缓存失效,以便从主内存重新加载变量。然后,我们就能看到前一个发布所公开的所有写入。
我还记得在现代Sun VM中,无争用锁同步是低成本的。但是这种说法让我有点困惑。考虑以下代码:
class Foo {
int x = 1;
int y = 1;
..
synchronized (aLock) {
x = x + 1;
}
}
对x的更新需要同步,但是锁的获取是否也会从缓存中清除y的值?我无法想象这种情况存在,因为如果是真的,那么像锁分离这样的技术可能就没有帮助了。另外,JVM可否可靠地分析代码,以确保在使用相同锁的另一个同步块中不修改y,从而在进入同步块时不将y的值转储到缓存中?