Il blocco degli oggetti può essere la causa dei deadlock se non stai attento. Supponiamo che tu abbia due strutture dati A e B che hanno bisogno di avere dati sincronizzati. Il thread 1 aggiorna A con nuove informazioni, quindi aggiorna B in modo che corrisponda. Thread 2 aggiorna B con nuove informazioni, quindi aggiorna A in modo che corrisponda.
Quindi il flusso di lavoro per il thread 1 potrebbe essere:
1. Receive new data.
2. Lock A.
3. Update A.
4. Lock B.
5. Update B to match.
6. Unlock B.
7. Unlock A.
8. Goto 1.
Nota che A e B sono bloccati contemporaneamente, quindi qualcun altro non modifica B finché non abbiamo sincronizzato le nostre modifiche tra i due.
Supponiamo che i thread 1 e 2 ricevano entrambe le nuove allo stesso tempo e necessitino di aggiornare le strutture di dati. L'ordine in cui le cose potrebbero accadere è totalmente imprevedibile, ma potrebbe essere:
1. Thread 1 locks A
2. Thread 1 updates A
3. Thread 2 locks B
4. Thread 2 updates B
5. Thread 1 now needs to update B, so it tries to lock B. B is already locked so it waits.
6. Thread 2 now needs to update A, so it tries to lock A. A is already locked so it waits.
7. Oops - deadlock. The whole program is now permanently stuck.