同步不同的对象可见性

时间:2018-10-13 15:05:13

标签: java multithreading synchronized volatile

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

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会出现问题,但是问题是方法1刷新的方法2的更改对方法1可见吗?因为他们没有使用相同的锁。

2 个答案:

答案 0 :(得分:1)

如果您仅阅读a,则在x64上,由于内存屏障不限于特定的内存位置,因此这将起作用。但是,我的理解是,由于锁适用于不同的对象,因此Java无法保证线程安全。当然,如果您在第一种方法中增加a,那么它将不是线程安全的。

答案 1 :(得分:1)

  

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

在没有任何其他同步的情况下,Java无法保证A.a在{的内部或外部}在一个线程中通过A.method2()A.method1()进行的修改是否可见或何时可见。 {1}}处于不同线程中。出现该问题的程序未正确同步,因此其行为未定义。