一、死锁产生的条件

从操作系统层面讲,产生死锁的必要条件有:
1 互斥条件:某一资源在某一时刻只能被一个线程占有。
2 请求与保持:某一线程因请求的资源被锁住而阻塞时,对已获得资源仍保持不释放。
3 不剥夺条件:某一线程已获得资源在没有使用完之前不能被其他线程强行剥夺,只有当前线程自己使用完资源才可以自己释放。
4 循环等待条件:若干线程形成一种头尾相接的循环等待资源等待关系。

二、避免死锁的方法

我们只要破坏产生死锁的四个条件之一就可避免死锁。

2.1 破坏互斥条件
无法做到,我们使用锁本来就是想让资源互斥访问的。

2.2 破坏请求与保持
a 一次性申请所有资源,阻塞这个线程直到所有需要的资源全部就位,比较低效耗时。
b 如果一个线程已经占有某些资源,但在进一步请求获取其他资源时被拒绝,那么立即释放已经占有的资源。

c 尽量避免一个线程获取多个资源。

2.3 破坏不可剥夺
如果一个线程在请求已经被其他线程占有的某一资源时,那么操作系统可以去抢占其他线程,要求它将资源释放。

2.4 避免循环等待
实行资源有序分配策略,如果一个线程已经被分配到了S级别的资源,那么接下来它只能请求被分配到那些在S级别后的资源类型。