Deadlock (взаимная блокировка) - это ситуация, которая возникает в многопоточных приложениях, когда два или более потоков заблокированы и ждут друг друга, чтобы завершить выполнение определенных действий. В результате ни один из этих потоков не может продолжить свое выполнение, что приводит к задержке работы всего приложения.
В Java есть два типа deadlock-а:
- Resource deadlock (deadlock ресурсов) - происходит, когда два или более потока ждут доступа к ресурсам, которые находятся в другом потоке и которые они сами удерживают. Например, если поток A заблокировал ресурс 1 и пытается получить доступ к ресурсу 2, который заблокировал поток B, в то время как поток B пытается получить доступ к ресурсу 1, заблокированному потоком A, то оба потока будут заблокированы, ожидая освобождения ресурсов.
- Thread deadlock (deadlock потоков) - происходит, когда два или более потока ждут друг друга, чтобы завершить выполнение определенных действий. Например, поток A заблокировал ресурс 1 и ждет, когда поток B освободит ресурс 2, в то время как поток B заблокировал ресурс 2 и ждет, когда поток A освободит ресурс 1.
Вот пример схематического изображения deadlocks:
Thread deadlock
-----------------------
Thread A -> resource 1 -> resource 2
\ /
\ /
v v
Thread B -> resource 2 -> resource 1
Resource deadlock
------------------------
Thread A -> resource 1 -> Thread B
Thread B -> resource 2 -> Thread A
На диаграмме "Thread deadlock" поток A ждет, чтобы поток B освободил доступ к ресурсу 2, в то время как поток B ждет, чтобы поток A освободил доступ к ресурсу 1.
На диаграмме "Resource deadlock" поток A удерживает доступ к ресурсу 1, который нужен для работы потока B, тогда как поток B удерживает доступ к ресурсу 2, которым нужно пользоваться потоку A.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov