死锁
首发 2026/05/28
阅读 0
评论 0
更新 2026/05/28
死锁
1. 一句话总结
死锁是多个进程或线程互相等待对方持有的资源,导致都无法继续执行。
2. 通俗解释
死锁像两个人过窄桥,甲拿着 A 钥匙等 B 钥匙,乙拿着 B 钥匙等 A 钥匙,谁都不先放手,最后都过不去。
3. 核心概念
- 互斥:资源一次只能被一个任务占用。
- 请求并保持:持有资源同时继续请求新资源。
- 不可剥夺:资源不能被强制抢走。
- 循环等待:多个任务形成等待环。
- 死锁预防:破坏四个条件之一。
- 死锁避免:分配前判断是否安全。
4. 底层原理
- 四个必要条件同时成立才可能死锁。
- 破坏循环等待常用固定加锁顺序。
- 一次性申请资源可破坏请求并保持,但资源利用率低。
- 银行家算法属于避免思想,工程中较少直接使用。
- 实际系统常用超时、tryLock、锁顺序、监控处理死锁。
5. 面试标准回答
死锁是多个线程或进程互相等待对方持有的资源,导致都无法继续执行。死锁产生需要四个必要条件:互斥、请求并保持、不可剥夺、循环等待。处理死锁可以从预防、避免、检测和恢复考虑。预防是破坏必要条件,例如按固定顺序加锁破坏循环等待;避免是在资源分配前判断是否安全;检测是运行时发现等待环;恢复可以超时释放、回滚或终止任务。工程中最常见的是减少嵌套锁、统一加锁顺序和使用 tryLock 超时。
6. 高频追问
追问 1:死锁面试第一句话怎么答?
先给结论:互斥:资源一次只能被一个任务占用。 再补充它解决的问题和使用场景,避免一上来背长定义。
追问 2:它为什么需要底层机制支撑?
四个必要条件同时成立才可能死锁。 面试官追问时要把“现象”落到“机制”和“代价”。
追问 3:常见误区是什么?
不要把平均情况说成绝对结论,也不要忽略边界条件、退化情况和工程成本。
追问 4:如果继续追问怎么展开?
可以沿着“定义 → 原理 → 对比 → 场景 → 缺点 → 优化”展开,重点说清:破坏循环等待常用固定加锁顺序。
追问 5:实际开发中怎么体现?
多线程业务中嵌套获取多把锁容易死锁。 这类联系能把基础知识从“背概念”变成“解释工程选择”。
追问 6:回答时怎么收尾?
最后用一句话总结适用条件和代价,说明什么时候该用、什么时候不该用。
7. 易混淆点
| 易混点 | 正确理解 | 面试提醒 |
|---|---|---|
| 死锁 | 多个任务互相等待 | 整体无法推进 |
| 饥饿 | 长期得不到资源 | 系统仍可运行 |
| 活锁 | 不断让步但无进展 | 状态变化但没完成 |
| 阻塞 | 等待某条件 | 不一定是死锁 |
8. 实际开发联系
- 多线程业务中嵌套获取多把锁容易死锁。
- 数据库事务更新顺序不一致可能死锁。
- 分布式锁要设置过期时间,避免永久等待。
9. 背诵速记
死锁四条件:互斥、请求并保持、不可剥夺、循环等待。解决思路是破坏条件、分配前避免、运行时检测、出问题恢复。工程上统一加锁顺序和 tryLock 超时最实用。
专题路径