我无法找到以下案例的答案:
public class Example {
int a=0;
public synchronized void method(Object x){
a++;
x.value=x.value+1;
}
}
我知道为同一个对象锁建立了发生之前关系,因此所有内容都应该写入内存(但不确定这里的所有内容是否包括对 x 的更改),
我的问题:如果其他线程使用相同的锁,是否保证对对象 x 的更改对其他线程可见? (锁位于示例对象上,但不在 x 本身上)
如果其他线程使用相同的锁,对对象
的更改是否保证对其他线程可见?x
是的,但这可能没用。
首先,我需要将您的示例代码转换为可编译的代码,并可用于说明您的问题。
public class Example {
int a = 0;
public synchronized void method(X x){
a++;
x.value = x.value+1;
}
}
public class X {
int value;
}
场景如下:
创建
Example
和Shared
的实例并将其传递给两个线程A和B。
线程 A 使用公共实例调用
example.method(x)
。
一段时间后,线程 B 使用公共实例调用
example.method(x)
。
保证线程 B 将看到 A 写入的
value
变量的更新值或稍后写入的另一个值。
它不能保证同时其他东西没有向
value
写入新值。此外,如果在 x.value
调用之外有任何内容写入 method
... 或使用不同的 Example
实例,那么所有的赌注都会被取消。
换句话说,存在一些有保证的行为,但由于围绕该保证的警告,因此很难利用它们。最好直接锁定
X
实例,或者隐藏它们,以便只能通过 Example
实例访问它们。