#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, но так как он может освободиться только выйдя из первого - то получилась бы блокировка самого себя
Комментариев нет:
Отправить комментарий