(操作系统)死锁是什么 必要条件 解决方式
一、什么是死锁?
死锁(Deadlock) 是指两个或多个进程(或线程)在执行过程中,因争夺资源而造成一种相互等待的现象。
如果没有外力作用,它们将永远陷入等待,程序无法继续执行。
👉 简单来说:大家都在等别人先释放资源,结果谁也不释放,形成无限等待。
二、死锁产生的必要条件
根据操作系统理论,死锁产生必须同时满足以下四个条件:
互斥条件
资源在同一时间只能被一个进程占用。
例如:一张数据库记录只能被一个事务持有锁。
占有且等待条件
进程已经持有至少一个资源,同时还在等待其他资源。
例如:线程 A 已经拿到了订单表的锁,还在等待库存表的锁。
不可剥夺条件
已经获得的资源,不能被强行剥夺,只能主动释放。
循环等待条件
存在一个进程—资源的环形等待链。
例如:线程 A 等待 B 的资源,线程 B 等待 A 的资源,形成闭环。
⚠️ 死锁发生的必要条件是四个条件同时满足,如果破坏掉其中一个条件,就能避免死锁。
三、业务场景举例
📍 电商下单场景
线程 A:先锁定订单表 → 再等待库存表。
线程 B:先锁定库存表 → 再等待订单表。
结果:两个线程互相等待对方释放锁 → 死锁。
四、死锁的解决方式
预防死锁(避免四个条件之一)
破坏“循环等待”:规定所有线程必须按照统一的顺序申请资源,例如必须先锁库存表,再锁订单表。
破坏“占有且等待”:要求进程一次性申请所需资源。
破坏“不可剥夺”:如果申请不到资源,就主动释放已持有的资源。
避免死锁(动态检测)
通过算法(如银行家算法)在分配资源前进行检测,确保系统不会进入不安全状态。
检测并解除死锁
定期检测是否存在环形等待。
一旦检测到死锁,选择“牺牲者”进程强制中止,释放资源。
实际工程手段
加锁顺序一致:所有业务代码按统一顺序获取锁。
锁超时机制:等待超时自动回滚,释放资源。
乐观锁(版本号机制):避免长时间持有锁。
五、总结
死锁是并发编程中常见的棘手问题,必须理解其 四个必要条件。
解决死锁的核心思想是 破坏死锁条件 或 避免环形等待。
在实际业务中,更常用的是 加锁顺序统一、加锁超时、乐观锁 等工程化手段。