一句话说透Java里面的线程死锁的条件

203 阅读1分钟

1. 互斥条件(你有的我不能抢)

  • 解释:资源(比如打印机、文件)一次只能被一个线程独占使用,其他线程想要必须等。
  • 例子:打印机同时只能打印一份文件,A线程用着,B线程只能干等。

2. 持有并等待(吃着碗里看着锅里)

  • 解释:线程已经占用了至少一个资源,但还在等别的资源,而且不释放已占用的。
  • 例子:A线程拿着打印机,还想用扫描仪;B线程拿着扫描仪,还想用打印机。两人互相等,谁都不放手。

3. 不可抢占(不能硬抢)

  • 解释:别人手里的资源不能强行抢走,只能等对方主动释放。
  • 例子:A拿着打印机不松手,B不能直接抢过来,只能等A用完。

4. 循环等待(你等我,我等你)

  • 解释:多个线程形成一个等待资源的环,每个人都在等下一个人的资源。

  • 例子

    • A等B的扫描仪;
    • B等C的摄像头;
    • C等A的打印机。
      → 三人转圈等,永远卡死。

总结:四个条件必须同时满足才会死锁!

预防死锁的土办法

  1. 破坏循环等待:按固定顺序获取资源(比如先拿打印机再拿扫描仪)。
  2. 设置超时:等资源超过时间就放弃,避免无限等。
  3. 别太贪心:一次性申请所有需要的资源,拿不到就全释放。

口诀
「互斥资源不能抢,占着资源还要等
不能强夺只能让,循环等待死锁生
破坏一环解僵局,顺序超时是良方!」