什么是死锁?
死锁是一种特殊的情况,发生在两个或多个线程彼此等待对方持有的资源,从而陷入无限等待的状态。具体而言,死锁通常涉及以下四个必要条件:
- 互斥条件:至少有一个资源被一个线程独占。
- 持有并等待:至少有一个线程持有资源,并等待获取由其他线程持有的资源。
- 不剥夺条件:资源不能被强制性剥夺,必须由持有它的线程自愿释放。
- 循环等待:存在一个线程循环等待链,即
T1
等待T2
持有的资源,T2
等待T3
持有的资源,直到Tn
等待T1
持有的资源。
常见的死锁场景
场景一:嵌套锁(Nested Locks)
最常见的死锁场景之一是嵌套锁。例如,线程 A 拥有锁 1,线程 B 拥有锁 2,接下来:
- 线程 A 尝试获取锁 2,但锁 2 被线程 B 持有。
- 线程 B