在不同的对象可见性上同步

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 块内部或外部,在不同的线程中。出现该问题的程序未正确同步,因此其行为未定义。