Jest to sytuacja, w której dwa lub więcej wątków/procesów są zablokowane ponieważ każdy z nich czeka na zakończenie działania drugiego.

- W sekundzie zerowej pierwszy proces rozpoczyna operację na zasobie A blokując go na czas wykonania całego bloku (blok oznaczony kolorem niebieskim)
- W pierwszej sekundzie drugi proces rozpoczyna operację na zasobie B, tym samym go blokując na czas wykonania całego bloku (blok oznaczony kolorem zielonym).
- W drugiej sekundzie drugi proces wciąż wykonuje operację na zasobie B, gdy pierwszy proces skończył już swoją pierwszą operację i próbuje wykonać drugą operację na zasobie B. Niestety zasób B jest tymczasowo zablokowany przez proces drugi – trzeba czekać.
- W sekundzie trzeciej drugi proces kończy operację na zasobie B (wciąż go blokując) i próbuje wykonać kolejną operację na zasobie A. Niestety zasób A jest tymczasowo zablokowany przez proces pierwszy- trzeba czekać.
- I mamy deadlock – pierwszy proces czeka na drugi, a drugi czeka na pierwszy.
Jak unikać?
- Należy skracać na ile tylko się da bloki synchronizowane/transakcje (a jeśli to możliwe to ich unikać).
- W przypadku bloków synchronizowanych należy unikać zagnieżdżeń (blok synchronizowany w bloku synchronizowanym).
- Jeśli jest to możliwe to warto używać blokad, które próbują nałożyć blokadę tylko przez określony czas, jeśli się nie uda to rezygnują (lock with timeout).
Warto zajrzeć
- Przykład w języku Java https://github.com/damianradowiecki/deadlock-example
- Opis deadlocku w bazach danych, świetny przykład Vlada Mihalcea https://vladmihalcea.com/database-deadlock/