死锁:通常状况下,若是同一个线程前后两次调用lock,在第一次调用时,因为锁已经被占用,该线程会挂起等待别的线程释放锁,然而锁正是被本身占用着的,该线程又被挂起而没有机会释放锁,所以 就永远处于挂起等待状态了,这叫作死锁(Deadlock)。 另外一种典型的死锁情形是这样:线程A获 得了锁1,线程B得到了锁2,这时线程A调lock试图得到锁2,结果是须要挂起等待线程B释放 锁2,这时线程B也调用lock试图得到锁1,结果是须要挂起等待线程A释放锁1,因而线程A和B都 永远处于挂起状态了。算法
产生的条件:ide
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。spa
请求与保持条件(Hold and wait):已经获得资源的进程能够再次申请新的资源。线程
非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。进程
循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每一个进程都在等待相邻进程正占用的资源。资源
如何避免:it
1.忽略该问题。例如鸵鸟算法,该算法能够应用在极少发生死锁的的状况下。为何叫鸵鸟算法呢,由于传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟以为看不到危险也就没危险了吧。跟掩耳盗铃有点像。io
2.检测死锁而且恢复。class
3.仔细地对资源进行动态分配,以免死锁。循环
4.经过破除死锁四个必要条件之一,来防止死锁产生。