🟣 死锁
2022年10月10日
- Java
 
🟣 死锁
1. 产生条件
- 以下四个条件必须同时满足:
 
1) 互斥
- 资源任意时刻只能被一个线程占有
 
2) 请求并保持
- 线程在已经有某种资源的情况下,还想要获取其他资源
 
3) 不可剥夺
- 线程拥有的资源不能被其他线程强行剥夺,只能由自己线程主动释放
 
4) 循环等待
- 各个线程在等待资源的过程中,形成环状等待链,如果没有外力作用,该状态永远不会发生改变
 
2. 如何打破
1. 产生条件
- 以下四个条件必须同时满足:
 
1) 破坏 请求并保持 条件
- 线程一次申请整个运行过程中的所有资源,不能存在过程中还想要申请其他资源的情况
 - 线程在已经有某种资源的情况下,还想要获取其他资源,若获取不到,则释放自己拥有的资源,还可以给获取时间加个时限
 
2) 破坏 不可剥夺 条件
- 线程拥有的资源当其他线程想要拥有时,线程释放自己的资源,优先满足他人
 
3) 破坏 循环等待 条件
- 线程在申请资源的过程中,按序申请
 
4) 循环等待
- 各个线程在等待资源的过程中,形成环状等待链,如果没有外力作用,该状态永远不会发生改变
 
3. 如何排查
jps找到到程序对应的 进程 idjstack pid跟踪该进程,得到栈信息,里面显示死锁问题所在
4. 银行家算法
1) 背景
- 进程
 - 可提供的资源
 - 各进程需要的各资源需求量
 
2) 原理
- 在实际分配前,进行预分配,判断是否可能出现死锁的情况 
- 若出现,则分配失败
 - 若不可能出现,则可以对资源进行分配