死锁 :
- 两个线程为了保护两个不同的共享资源, 并用两个互斥锁
- 当 2 个互斥锁互斥双方资源, 两个线程都等待对方释放锁, 就会一直相互等待
死锁条件
死锁同时满足四个条件才会发生:
- 互斥条件
- 持有并等待条件
- 不可剥夺条件
- 环路等待条件
互斥
互斥条件: 多个线程不能同时用同个资源
- 线程 A 已持有资源,线程 B 就不能持有
- 线程 B 请求资源, 线程 B 只能等待
- 当线程 A 释放资源, 线程 B 才能持有
持有并等待
持有并等待条件 :
- 线程 A 已持有资源 1,又要申请资源 2
- 资源 2 已被线程 C 持有,线程 A 只能等待
- 但线程 A 等待资源 2, 同时不会释放持有资源 1
不可剥夺
不可剥夺条件:
- 线程 A 已持有资源
- 线程 B 用此资源,只能等线程 A 释放, 才能获取
环路等待
环路等待条件: 死锁发生时,两个线程获取资源的顺序是环形链
- 线程 A 已持有资源 2, 还想请求资源 1
- 线程 B 已获取资源 1,还想请求资源 2
避免死锁
避免死锁, 只要破环其中一个条件可
- 常见方法: 资源有序分配法,破环环路等待条件
资源有序分配法: 线程 A/B 获取资源的顺序一样
- 当线程 A 先尝试获取资源 2,再尝试获取资源 1
- 线程 B 也先尝试获取资源 2,再尝试获取资源 1