Q:什么是死锁?死锁产生的条件、检测和解决方法是什么?
来源:小红书 Agent 岗一面
新手答:“两个线程互相等锁,所以程序卡住了。”
高手答:
死锁是多个执行单元永久等待彼此持有的资源,导致都无法继续。经典四个必要条件是:互斥、占有且等待、不可抢占、循环等待;四者同时成立才可能死锁。
工程上有四类处理方法:
- 预防:统一锁顺序,破坏循环等待;一次申请全部资源,破坏占有且等待。
- 避免:已知最大资源需求时用银行家算法,只进入安全状态。
- 检测与恢复:构建等待图检测环;发现后超时回滚、取消任务或重启受影响执行单元。
- 降低风险:缩小临界区、使用超时锁和
try/finally、避免持锁做网络 I/O,能用消息传递或不可变数据时少共享锁。
在 Agent 系统中也会出现逻辑死锁:主 Agent 等子 Agent,子 Agent 又等待主 Agent 提供信息;两个任务分别持有文件锁和数据库锁并交叉申请。除了线程 dump,还要用 task_id、锁持有者、等待边和超时事件构建可观测的等待图。
差距在哪:新手只描述现象;高手能说出四条件、破坏哪个条件,以及如何检测和恢复。