Java多线程 死锁的检测与恢复策略

检测与恢复策略

检测与恢复策略: 一段时间检测是否有死锁, 如果有剥夺某一个资源 ,打开死锁.

死锁的检测算法 :
允许发生死锁.
每次调用锁的时候 , 都做记录,用图的数据结构来记录.
根据有向图的方向, 定期检查 "锁的调用链路"中是否存在环路.

一旦发生死锁, 用死锁恢复机制进行恢复.

  • 恢复方法1 : 进程终止
    逐个的终止线程, 直到死锁消除为止.
    终止的顺序
  1. 根据优先级终止, 看是前台的交互更加的重要, 还是后台的处理更重要
  2. 根据已经占用的资源和 还需要的资源来决定某个哪个线程终止. 例如某个线程还只需一点资源就结束任务了, 那么就不终止此线程.
  3. 根据线程已经运行的时间来决定某个哪个线程终止. 例如某个线程已经执行了很长的时间了, 那么就终止其他短时间的线程来帮助此长时间运行的线程完成任务.
  • 恢复方法2 : 资源抢占(资源回收)
    资源抢占 是指把已经分发出去的锁资源给收回来. 让线程回退几步, 回收锁资源, 这样就不用终止整个线程, 成本较低.
    缺点: 可能某一个线程, 一直被抢占, 即一直被锁资源给收回来了, 那么就会造成饥饿,一直得不到运行.

死锁的修复策略总结

  1. 避免策略: 哲学家就餐换手的方案, 让某一个哲学家从相反的方向拿筷子
  2. 检测与恢复策略: 一段时间检测是否有死锁, 如果有剥夺某一个资源 ,打开死锁. 两种办法恢复死锁.
    a. 进程终止
    b. 资源抢占(资源回收)
  3. 鸵鸟策略 (不推荐) :只有在出现死锁的时候, 才进行处理死锁

猜你喜欢

转载自blog.csdn.net/qq_33229669/article/details/108551963