线程死锁的条件和解决死锁

一 线程死锁的条件

  • 互斥条件

    被申请的资源同时只能被一个线程占有
  • 请求与保持条件

    如果线程阻塞或等待,其占有的资源不会主动释放
  • 不剥夺条件

    线程已获得的资源在使用完成前不能被其他线程抢占,只能自己使用完成后才能释放
  • 循环等待条件

    若干线程之间形成头尾相接的循环等待资源关系

二 如何解决死锁

当我们知道线程死锁的原因后,就可以自然地得出解决死锁的办法,针对性的对每一个产生的原因去解决就行

  • 解决互斥条件

    互斥条件一般是没法解决的,我们加锁的目的就是为了保持资源互斥
  • 解决请求与保持条件

    我们可以避免线程陷入请求与保持阶段,如何避免呢?让线程一下子申请到所有需要的资源,要么就申请不到资源。相当于一个粗粒度锁,线程不再会在阻塞时占有资源,因为如果申请不到所有的资源而阻塞的话,这个线程此刻是不占有资源的。
  • 解决不剥夺条件

    我们可以让线程在请求别的资源时释放掉自己占有的资源
  • 解决循环等待条件

    可以把申请资源的过程限定为按序申请资源,释放资源则按反序释放,以此来破坏循环等待条件

猜你喜欢

转载自blog.csdn.net/weixin_44062399/article/details/123747291