Ответ (Pram's), помеченный как правильный, технически не является тупиковым, как предлагали другие. Его только что заблокировали.
Я бы сказал, что в Java вы можете опираться на определение Java (что согласуется с идеей двух потоков). В этом случае конечным судьей может стать JVM, если обнаружит сам тупик . Так, в примере с Pram поток показывал что-то вроде следующего, если бы это был тупик geniune.
Deadlock detected
=================
"Negotiator-Thread-1":
waiting to lock Monitor of com.google.code.tempusfugit.concurrency.DeadlockDetectorTest$Cat@ce4a8a
which is held by "Kidnapper-Thread-0"
"Kidnapper-Thread-0":
waiting to lock Monitor of com.google.code.tempusfugit.concurrency.DeadlockDetectorTest$Cash@7fc8b2
which is held by "Negotiator-Thread-1"
Это обнаружение тупиковой ситуации доступно для внутренних блокировок начиная с 1.5 и на основе циклических блокировок Lock
начиная с 1.6.
Постоянно блокируемый ресурс или, по крайней мере, то, что ожидает чего-то, что никогда не произойдет, называется livelock . Подобные проблемы, когда процессы вне взаимных блокировок баз данных VM (например) вполне возможны, но я бы сказал, что не подходит для этого вопроса.
Мне было бы интересно написать, как интервьюер утверждает, что это возможно ...
В ответ на ваш первоначальный вопрос, для танго нужны двое, и Я бы предложил, чтобы ответ Прам не был помечен как правильный, потому что это не так! ;) Поток RMI, который вызывает обратно, может вызвать блокировку но он работает в другом потоке (управляемом сервером RMI), чем основной. Два потока вовлечены, даже если основной поток явно не настроил другой. Отсутствует взаимоблокировка, о чем свидетельствует отсутствие обнаружения в дампе потока (или, если вы нажмете «обнаружить взаимоблокировку» в jconsole), это будет более точно описано как «живая» блокировка.
Сказав все это, любой дискуссии по каждому из этих ответов будет достаточно, чтобы удовлетворить меня как интервьюера.