考虑以下代码:
public class Foo {
private static final Object LOCK = new Object();
private Object _lockRef1 = LOCK;
private Object _lockRef2 = LOCK;
private int _indx = 0;
public void dec() {
synchronized(_lockRef1) {
_indx--;
}
}
public void inc() {
synchronized(_lockRef2) {
_indx++;
}
}
}
调用方法 dec()
和 inc()
是线程安全的吗?一方面,这些方法在两个不同的实例 _lockRef1
和 _lockRef2
上同步。另一方面,这些实例“指向”同一个对象 LOCK
...
最佳答案
它们不是“在两个不同的实例上同步”——仅仅因为您使用两个不同的变量并不意味着有两个不同的实例。您有几个变量,每个变量都具有相同的值 - 对 java.lang.Object
的单个实例的引用。
所以是的,这是线程安全的。当然,就可读性而言,您不应该编写这样的代码,但假设您只是想了解发生了什么,这很好。
关于java - 在 "reference"或实例上同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1900384/