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