Вложенный lock на одном и том же обычном объекте в одном потоке не вызывает deadlock: Monitor реентерабелен. Точный вывод зависит от отсутствующих в условии инструкций печати.
Что будет выведено в C#-коде с вложенными lock на одном syncObject? Будет ли deadlock и почему?
Вложенный lock на одном и том же обычном объекте в одном потоке не вызывает deadlock: Monitor реентерабелен. Точный вывод зависит от отсутствующих в условии инструкций печати.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Вложенный lock на одном и том же обычном объекте в одном потоке не вызывает deadlock: Monitor реентерабелен. Точный вывод зависит от отсутствующих в условии инструкций печати.
Повторный вход увеличивает счётчик захватов текущего потока. Чтобы другой поток получил монитор, нужно выйти из всех соответствующих lock. Поэтому обычные вложенные блоки выполнятся последовательно, а затем завершатся.
Это не делает произвольный код безопасным от deadlock: ожидание другого потока, которому тоже нужен этот lock, может создать цикл. Нельзя также переносить гарантию на разные объекты синхронизации или на неописанный порядок их захвата.