在以下简单场景中:
class A {
int x;
Object lock;
...
public void method(){
synchronized(lock){
// modify/read x and act upon its value
}
}
}
x是否需要变化?我知道同步保证原子性,但我不确定可见性虽然...确实锁定 - >修改 - >解锁 - >锁定保证,在第二次锁定后,x的值将是" fresh"?
答案 0 :(得分:8)
不,不,同步之后已经插入了内存屏障,因此所有线程都会看到当前线程执行的更新,同时考虑到其他线程将在同一个线程上同步锁。
易失性,就像synchronized有附加的内存屏障一样 - 取决于它是存储/加载/完全屏障的cpu,确保一个线程的更新对其他线程可见。 我假设这是使用cpu cache invalidation 执行的。
修改强> 从我刚刚阅读的内容来看,存储缓冲区被刷新到CPU缓存,这就是实现可见性的方式。
答案 1 :(得分:2)
简化回答:如果线程A更新一个字段然后释放一个锁,那么线程B将保证在线程B获得相同的锁之后看到更新。
注意,"释放锁定"表示退出synchronized
块,并且"获取相同的锁定"意味着在同一个对象上同步。