Синхронизация / блокировка Java - PullRequest
2 голосов
/ 07 ноября 2011

Я относительно новичок в параллелизме в Java (еще не прочитал JCIP, но он в моем списке!), И у меня есть вопрос относительно поведения блокировки.В частности, блокирует ли Java ссылку на объект или на сам объект?

Пример кода (не sscce, потому что я не знаю, как продемонстрировать такое поведение на практике):

static final Object lockA = new Object();

public void method1() {
    synchronized(lockA) {
        // do stuff here
    }
}

public void method2() {
    Object lockB = lockA;
    synchronized(lockB) {
        // do stuff
    }
}

Если другой поток выполняет method1() (и поэтому имеет блокировку на lockA), будет ли разрешено выполнение method2()?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 07 ноября 2011

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

С каждым объектом связана «внутренняя блокировка» (см. «Внутренние блокировки и синхронизация» ). Синхронизированный блок использует встроенную блокировку, связанную с объектом, с которым вы синхронизируете.

3 голосов
/ 07 ноября 2011

Нет, method2() будет блокироваться, поскольку оба метода синхронизируются на одном и том же объекте (lockB - это просто ссылка, указывающая на тот же объект, что и lockA).

...