在不同的对象可见性上同步
synchronize on different object visibility
以下代码显示了与此不同的对象上的同步:
public class A {
int a,b,c,d;
public void method1(Object x){
synchronized(x){
// is a ,b ,c ,d guarantee visibility ?
}
}
public synchronized void method2() {
a++;
}
}
我知道在 method1 和 method2 中使用不同的锁来编辑 a、b、c、d 会有问题,但问题是 method1 可以看到 method2 刷新的更改吗?因为他们不使用相同的锁。
如果您只阅读 a
,在 x64 上这将恰好起作用,因为内存屏障不限于特定的内存位置。但是,我的理解是 Java 不能保证这将是线程安全的,因为锁适用于不同的对象。当然,如果你在第一种方法中递增 a
,它就不是线程安全的。
I know there will be a problem to edit a , b ,c ,d with having different lock in method1 and method2 , but the question is the changes flushed by method2 be visible to method1 ? because they don't use the same lock.
如果没有任何其他同步,Java 无法保证在一个线程中通过 A.method2()
对 A.a
执行的修改是否或何时对 A.method1()
可见,在 synchronized
块内部或外部,在不同的线程中。出现该问题的程序未正确同步,因此其行为未定义。
以下代码显示了与此不同的对象上的同步:
public class A {
int a,b,c,d;
public void method1(Object x){
synchronized(x){
// is a ,b ,c ,d guarantee visibility ?
}
}
public synchronized void method2() {
a++;
}
}
我知道在 method1 和 method2 中使用不同的锁来编辑 a、b、c、d 会有问题,但问题是 method1 可以看到 method2 刷新的更改吗?因为他们不使用相同的锁。
如果您只阅读 a
,在 x64 上这将恰好起作用,因为内存屏障不限于特定的内存位置。但是,我的理解是 Java 不能保证这将是线程安全的,因为锁适用于不同的对象。当然,如果你在第一种方法中递增 a
,它就不是线程安全的。
I know there will be a problem to edit a , b ,c ,d with having different lock in method1 and method2 , but the question is the changes flushed by method2 be visible to method1 ? because they don't use the same lock.
如果没有任何其他同步,Java 无法保证在一个线程中通过 A.method2()
对 A.a
执行的修改是否或何时对 A.method1()
可见,在 synchronized
块内部或外部,在不同的线程中。出现该问题的程序未正确同步,因此其行为未定义。