public class Test {
int a = 0;
int b = 0;
public synchronized void setAB(int a, int b) {
this.a = a;
this.b = b;
}
public synchronized int getA() {
return a;
}
public int getB() {
return b;
}
Thread-1调用setAB(1,5) - 以原子方式设置a和b的值。
Thread-2调用getA() - 同步访问。这个调用确定在与上述关系之前发生。线程应该能够看到a的更新值。
Thread-2调用getB() - 这是非同步调用。它会看到更新b,即5?
答案 0 :(得分:5)
一般来说,对于getB()调用,没有"在关系"之前发生,没有可见性保证。重要的是同步读取和写入,并在同一个锁上同步。
但是,如果在同一个线程中的getA()之后调用getB(),则"在关系之前发生#34;已经建立,并保证线程可以看到所有更改。
解释here(我更加强调):
监视器的解锁(同步块或方法退出)发生在同一监视器的每个后续锁定(同步块或方法条目)之前。并且因为之前发生的关系是可传递的,所以解锁前线程的所有操作都会发生 - 在任何线程锁定监视之后的所有操作之前。