一、什么是死锁
多个线程都在等待对方的资源,在没有得到资源之前,都不会释放自己的资源,这样造成的循环等待现象,称为死锁。
二、死锁产生的四大条件
1、资源互斥
一个资源每次只能被一个进程使用
2、占有,还想占有(请求并保持)
一个进程因请求资源而阻塞时,对已获取的资源保持不放
3、资源不可剥夺
进程已经获得资源,在未使用完之前,不能强行剥夺
4、环路等待(互相等待)
若干个进程之间形成一种头尾相接的循环等待资源的关系
三、预防方法
构成死锁的四个条件只要破坏其中一个就构不成死锁,死锁一旦形成就无法消除,因此最好的方法就是避免产生死锁。
1、破坏互斥条件,让资源能够共享,但缺点是不通过,因为有些资源不能共享,如打印机。
2、破坏请求并保持条件,采用预先分配的方法,在进行运行前一次性申请好它所需要的所有资源,但缺点是浪费资源。
3、破坏不可剥夺的条件,对已经占用资源的线程发送取消请求,但是实现比较复杂,而且还有破坏业务逻辑。
4、破坏循环等待条件,为每个资源进行编号,采用顺序的的资源分配方法,规定每个线程必须按照递增的顺序请求资源,缺点是编号必须相对稳定,增加新资源时会比较麻烦,而且有些特殊的业务逻辑不能按完全按照指定的顺序分配资源。
四、避免产生死锁的算法(银行家算法)
1、贷款的额度不能超过银行现有资金的总和。
2、分批向银行货款,但是货款额度不能超过一开始最大需求量总合。
3、银行如果不能满足客户的需要,必须即时给出答复。
4、客户必须在规定时间内还款。
五、如何检测死锁
1、画出图资源分配图,并简化,模拟资源分析的过程。
2、监控线程过程的栈内存使用情况。
3、设计看门狗机制(TCP心跳包)。