Подтвердить что ты не робот

Синхронизация на "ссылке" или на примере

Рассмотрим следующий код:

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...

4b9b3361

Ответ 1

Они не синхронизированы в двух разных экземплярах - просто потому, что вы используете две разные переменные, это не значит, что есть два разных экземпляра. У вас есть несколько переменных, каждое из которых будет иметь одно и то же значение - ссылку на единственный экземпляр java.lang.Object.

Итак, это потокобезопасно. Конечно, вы не должны писать такой код с точки зрения удобочитаемости, но, предполагая, что вы просто пытаетесь понять, что происходит, все в порядке.