Страницы

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

понедельник, 15 октября 2018 г.

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

Встретил вот такой пример (стр 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? Как происходит их (инструкций) взаимодействие между собой?


Ответ

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

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

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