同步方法调用后,同步是否允许查看所有变量?

时间:2015-02-01 03:16:33

标签: java multithreading thread-safety

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?

1 个答案:

答案 0 :(得分:5)

一般来说,对于getB()调用,没有"在关系"之前发生,没有可见性保证。重要的是同步读取和写入,并在同一个锁上同步

但是,如果在同一个线程中的getA()之后调用getB(),则"在关系之前发生#34;已经建立,并保证线程可以看到所有更改。

解释here(我更加强调):

  

监视器的解锁(同步块或方法退出)发生在同一监视器的每个后续锁定(同步块或方法条目)之前。并且因为之前发生的关系是可传递的,所以解锁前线程的所有操作都会发生 - 在任何线程锁定监视之后的所有操作之前。