Java多线程 死锁发生的四个必要条件

死锁发生的四个必要条件

  1. 互斥条件:一个资源同时只能被一个线程所使用.
  2. 请求与保持条件: 例如请求第二把锁的时候, 保持自身的第一把锁不去释放.
  3. 不剥夺条件: 进程已获得的资源(例如已经获得的锁),没有外界的力量来去剥夺这把锁.
  4. 循环等待条件: 两个线程时, 是你等我释放锁, 我等你释放锁. 多个线程时, 是头尾相接的等待.
    例如下图

以上的四个条件,为死锁发生的必要条件, 即必须同时满足这四种情况, 才会发生死锁.

死锁案例解读

例如此文的例子中.
https://javaweixin6.blog.csdn.net/article/details/108460550
第一个条件, 互斥条件.
如下为互斥条件. static变量在程序运行中,只有一个. synchronized中的锁o1和o2只能被一个线程所持有.

第二点请求与保持条件 , 线程1保持锁o1,请求锁o2. 线程2 保持锁o2 , 请求锁o1.并且synchronized的特点就是没有获取到锁的时候, 也不会去释放锁.

第三点 不剥夺条件.在相互等待对方的锁资源 时候, 不会有额外的力量去剥夺某一方的锁, 只会让他们继续等待下去.
第四点 循环等待条件. 两个线程的时候, 线程1与线程2相互等待. 多个线程的时候, 形成环路的等待.

只要破解了其中一个条件, 死锁就不会发生了.

猜你喜欢

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