首页 > 解决方案 > 同步不同的对象可见性

问题描述

以下代码显示了与此不同的对象上的同步:

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++;
    }
}

我知道在方法 1 和方法 2 中具有不同的锁定来编辑 a 、 b 、 c 、 d 会有问题,但问题是方法 2 刷新的更改对方法 1 是可见的吗?因为他们不使用相同的锁。

标签: javamultithreadingsynchronizedvolatile

解决方案


如果您只读取a, 在 x64 上这将发生,因为内存屏障不限于特定的内存位置。但是,我的理解是 Java 不保证这将是线程安全的,因为锁适用于不同的对象。当然,如果你a在第一个方法中递增,它就不是线程安全的。


推荐阅读