Синхронизация на "ссылке" или на примере
Рассмотрим следующий код:
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()
threadsafe? С одной стороны, эти методы синхронизируются в двух разных экземплярах _ lockRef1
и _ lockRef2
. С другой стороны, эти экземпляры "указывают" на один и тот же объект LOCK
...
Ответы
Ответ 1
Они не синхронизированы в двух разных экземплярах - просто потому, что вы используете две разные переменные, это не значит, что есть два разных экземпляра. У вас есть несколько переменных, каждое из которых будет иметь одно и то же значение - ссылку на единственный экземпляр java.lang.Object
.
Итак, это потокобезопасно. Конечно, вы не должны писать такой код с точки зрения удобочитаемости, но, предполагая, что вы просто пытаетесь понять, что происходит, все в порядке.