什么是死锁:成因、示例与规避策略
副标题 / 摘要 死锁发生在多个线程互相等待对方持有的资源。本文解释成因、给出示例,并总结规避方法。 目标读者 需要理解并发风险的工程师 负责系统可靠性的开发者 做并发设计评审的技术负责人 背景 / 动机 死锁通常在压力或线上才出现,一旦发生会导致服务完全卡住。 理解死锁条件并提前规避,是并发系统的必修课。 核心概念 互斥:资源一次只能被一个线程占用 占有且等待:拿着资源还要等另一个资源 不可抢占:资源不能被强制夺取 循环等待:形成等待环 实践指南 / 步骤 统一锁顺序(按固定顺序获取) 减少锁数量 设置超时与回退 用锁分层减少交叉等待 监控阻塞与持锁时间 可运行示例 import threading import time lock_a = threading.Lock() lock_b = threading.Lock() def t1(): with lock_a: time.sleep(0.1) with lock_b: pass def t2(): with lock_b: time.sleep(0.1) with lock_a: pass if __name__ == "__main__": threading.Thread(target=t1).start() threading.Thread(target=t2).start() time.sleep(1) print("可能已死锁") 解释与原理 当 t1 拿着 A 等 B,而 t2 拿着 B 等 A,就形成循环等待。 满足四个必要条件时死锁发生。 ...