[英]Does synchronization allow visibility to all variables after synchronized method call?
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;
}
线程 1 调用 setAB(1,5) - 原子地设置 a 和 b 的值。
线程 2 调用 getA() - 同步访问。 这个调用建立发生在与上面的关系之前。 线程应该能够看到 a 的更新值。
线程 2 调用 getB() - 这是非同步调用。 它会看到 b ie 5 的更新吗?
一般来说,对于 getB() 调用,没有“在关系之前发生”,也没有可见性保证。 同步读取和写入并在同一个锁上同步它们很重要。
但是,如果在同一线程中在 getA() 之后调用 getB(),则“发生在关系之前”已经建立,并且该线程可以保证看到所有更改。
在这里解释(我特别强调):
监视器的解锁(同步块或方法退出)发生在同一监视器的每个后续锁(同步块或方法入口)之前。 并且因为happens-before 关系是可传递的,线程在解锁之前的所有操作都发生在该监控的任何线程锁定之后的所有操作之前。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.