Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

В чем смысл вложенных друг в друга инструкций synchronized?

#java #синхронизация


Встретил вот такой пример (стр 422)

class Test {
    public static void main(String[] args) {
        Test t = new Test();
        synchronized(t) {
            synchronized(t) {
                System.out.printIn("made it!");
            }
        }
    }
}


Далее, видимо, объяснение на мой вопрос, но для меня не вполне очевидное.


  Вывод этой программы имеет вид

made it!

  
  Обратите внимание, что эта программа оказалась бы в состоянии
  взаимоблокировки, если бы один поток не мог многократно блокировать
  монитор.


Инструкция synchronized понятна, захватывает блокировку, выполняет тело инструкции,
освобождает блокировку. 

А в чем смысл вложенных друг в друга инструкций synchronized? Как происходит их (инструкций)
взаимодействие между собой?
    


Ответы

Ответ 1



Данный пример призван показать, что один поток может делать сколько угодно вложенных synchronized и не зависнет при этом. О чем и говорит выведенное сообщение. Если бы это не работало, то программа бы подвисла на втором synchronized пока не освободится t, но так как он может освободиться только выйдя из первого - то получилась бы блокировка самого себя

Комментариев нет:

Отправить комментарий