Обычный поток, «предполагая», что поток 1 выполняется первым (на самом деле он все еще может зайти в тупик, если t2 перехватит l2 до t1):
t1 acquires l1
t1 acquires l2 //before t2..
t1 unlocks l2
t1 unlocks l1
t2 acquires l2
t2 sleeps
t2 acquires l1
t2 unlocks l1
t2 unlocks l2
Если t2 «запускается первым» ..
t2 acquires l2
t2 sleeps
t1 acquires l1 (while t2 is still sleeping)
t1 tries to acquire l2 but blocks.. it's already acquired by t2..
t2 is finished sleeping..
t2 tries to acquire l1 but blocks.. it's already acquired by t1..
IE: вы можете отладить и увидеть его в виде:
Start T2
T2 - Locked L2
T2 - Sleeping
Start T1
T1 - Locked L1
- DeadLock .. Ни один из них не может продолжаться, если другой не разблокируется ..
Это неопределенное поведение. Вы также не должны угадывать, какой поток запускается первым.