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