Note

死锁成立的条件是什么?

说明死锁的四个必要条件:互斥、占有并等待、不可抢占、循环等待。

省流

死锁(Deadlock)指多个进程或线程互相等待对方持有的资源,导致所有相关方都无法继续推进。经典结论是:死锁的发生需要同时满足四个必要条件。

  1. 互斥:资源同一时刻只能被一个执行流占用。
  2. 占有并等待:已经持有至少一个资源,同时仍等待获取其他资源。
  3. 不可抢占:已获得的资源不能被强制剥夺,只能由持有者主动释放。
  4. 循环等待:存在环状等待链,例如 A 等 B 持有的资源,B 等 C,C 又等 A。

四个条件同时成立才可能死锁;破坏其中任意一个,即可从理论上避免该类死锁。实际系统中还要区分活锁、饥饿与长时间阻塞,它们表现类似但定义不同。

四个条件分别意味什么?

互斥(Mutual Exclusion)

锁、写模式的文件、某些硬件设备天然互斥。若资源可共享且并发访问安全,就不会因“抢同一份独占权”进入死锁。

占有并等待(Hold and Wait)

线程已经拿到锁 L1,又不释放,继续申请锁 L2。若允许的策略是“要么一次要齐所有资源,要么不占有任何资源地等待”,就可以削弱该条件。

不可抢占(No Preemption)

多数互斥锁不能由调度器随意夺走;必须由持有者 unlock。若协议允许在安全点撤销并回滚资源占用,则可能打破不可抢占。

循环等待(Circular Wait)

等待关系在资源分配图中形成环。只要环存在,再加上前三个条件,系统就可能卡住。

最小例子

线程 A:持有锁 1,申请锁 2
线程 B:持有锁 2,申请锁 1

互斥、占有并等待、不可抢占、二人循环等待同时满足,形成死锁。

答题注意

  • 四个条件是“必要”条件:同时满足才可能死锁;满足不等于此刻一定已经死锁,还取决于具体时序。
  • 回答应使用标准术语,不要把“多线程”本身说成死锁条件。
  • 单线程若在异步回调或错误的锁重入设计下,也可能构造出逻辑上的环状等待,但面试默认语境仍是多执行流与共享资源。