以下代码显示了与此对象不同的同步:
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可见吗?因为他们没有使用相同的锁。
答案 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}}处于不同线程中。出现该问题的程序未正确同步,因此其行为未定义。