🟣 死锁

吞佛童子2022年10月10日
  • Java
  • concurrency
大约 2 分钟

🟣 死锁

1. 产生条件

  • 以下四个条件必须同时满足:

1) 互斥

  • 资源任意时刻只能被一个线程占有

2) 请求并保持

  • 线程在已经有某种资源的情况下,还想要获取其他资源

3) 不可剥夺

  • 线程拥有的资源不能被其他线程强行剥夺,只能由自己线程主动释放

4) 循环等待

  • 各个线程在等待资源的过程中,形成环状等待链,如果没有外力作用,该状态永远不会发生改变

2. 如何打破

1. 产生条件

  • 以下四个条件必须同时满足:

1) 破坏 请求并保持 条件

  • 线程一次申请整个运行过程中的所有资源,不能存在过程中还想要申请其他资源的情况
  • 线程在已经有某种资源的情况下,还想要获取其他资源,若获取不到,则释放自己拥有的资源,还可以给获取时间加个时限

2) 破坏 不可剥夺 条件

  • 线程拥有的资源当其他线程想要拥有时,线程释放自己的资源,优先满足他人

3) 破坏 循环等待 条件

  • 线程在申请资源的过程中,按序申请

4) 循环等待

  • 各个线程在等待资源的过程中,形成环状等待链,如果没有外力作用,该状态永远不会发生改变

3. 如何排查

  1. jps 找到到程序对应的 进程 id
  2. jstack pid 跟踪该进程,得到栈信息,里面显示死锁问题所在

4. 银行家算法

1) 背景

  1. 进程
  2. 可提供的资源
  3. 各进程需要的各资源需求量

2) 原理

  • 在实际分配前,进行预分配,判断是否可能出现死锁的情况
    • 若出现,则分配失败
    • 若不可能出现,则可以对资源进行分配
上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou