请考虑以下代码:
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
...
答案 0 :(得分:18)
它们不是“在两个不同的实例上同步” - 仅仅因为您使用两个不同的变量并不意味着有两个不同的实例。你有几个变量,每个变量具有相同的值 - 对java.lang.Object
的单个实例的引用。
所以是的,这是线程安全的。当然,你不应该在可读性方面编写这样的代码,但假设你只是想了解发生了什么,那就没关系了。