Reentrant Synchronization- разблокировка вызванного синхронизированного метода

void method1() {
     synchronized(this) {  // Acquires intrinsic lock
      method2();
    }   
}

void method2() {
     synchronized(this) {} // Acquires same lock due to Reentrant synchronization
}

Первая временная блокировка получается в method1, который вызывает синхронизированный метод2, где во второй раз он получает такую ​​же блокировку.

Теперь я сомневаюсь, что когда синхронизированный блок заканчивается в method2(), разблокировка происходит здесь впервые и возвращается к синхронизированному блоку method1(), где снова разблокировка происходит во второй раз.

Управляет ли он внутренним количеством блокировок, как в ReentrantLock?

2 ответа

Решение

Управляет ли он внутренним количеством блокировок, как в ReentrantLock?

Да. Из раздела 17.1 JLS - акцент мой.

Язык программирования Java предоставляет несколько механизмов для взаимодействия между потоками. Основным из этих методов является синхронизация, которая реализуется с помощью мониторов. Каждый объект в Java связан с монитором, который поток может заблокировать или разблокировать. Только один поток одновременно может удерживать блокировку на мониторе. Любые другие потоки, пытающиеся заблокировать этот монитор, блокируются, пока они не смогут получить блокировку на этом мониторе. Тема t может заблокировать определенный монитор несколько раз; каждая разблокировка отменяет эффект одной операции блокировки.

Да, внутренне JDK следит за входом.

Согласно документам оракула:

Напомним, что поток не может получить блокировку, принадлежащую другому потоку. Но поток может получить блокировку, которой он уже владеет. Разрешение потоку получить одну и ту же блокировку более одного раза включает повторную входящую синхронизацию. Это описывает ситуацию, когда синхронизированный код прямо или косвенно вызывает метод, который также содержит синхронизированный код, и оба набора кода используют одну и ту же блокировку. Без повторной входящей синхронизации синхронизированный код должен был бы принять много дополнительных мер предосторожности, чтобы избежать того, что поток сам себя блокирует.

Смотрите это для деталей.

Другие вопросы по тегам