死鎖產生的4個必要條件:
1、互斥:乙個資源同一時刻只允許乙個執行緒進行訪問。
2、占有未釋放:乙個執行緒占有資源,且沒有釋放資源。
3、不可搶占:乙個已經占有資源的執行緒無法搶占到其他執行緒擁有的資源。
4、迴圈等待:兩個或者兩個以上的執行緒,本身擁有資源,不釋放資源,並且同時嘗試獲得其他執行緒所持有的資源,這種資源的申請關係形成乙個閉環的鏈條。
死鎖的避免:
關於死鎖的避免,仁者見仁智者見智。
主要還是從造成死鎖的四個條件入手,四個條件不能滿足,就不會死鎖。
以下是我本人的一些方法:
1.執行緒等待時(wait)給予乙個預設的等待時間
2.執行緒之間資源避免相互申請對方的資源,可以通過一些容器來控制併發,比如blockqueue,等等一些執行緒安全的容器
3.盡量避免執行緒在等待的同時申請資源
4.死鎖檢測,乙個執行緒在等待一段時間後還沒有獲得資源就放棄申請。對等待時間進行檢測。
乙個死鎖的例子:
#執行緒死鎖,在classa和classb相互呼叫對方的方法,並且相互等待對方釋放資源
classclassa:def __init__(self):
self.lock=threading.rlock()#得到classa的鎖,試圖得到classb的鎖
definfoa(self, b):
self.lock.acquire()
time.sleep(10)
b.info()
self.lock.release()definfo(self):
self.lock.acquire()print("this is classa info")
self.lock.release()classclassb:def __init__(self):
self.lock=threading.rlock()#得到classb的鎖,試圖得到classa的鎖
definfob(self, a):
self.lock.acquire()
time.sleep(10)
a.info()
self.lock.release()definfo(self):
self.lock.acquire()print("this is classb info")
self.lock.release()
ca=classa()
cb=classb()deffuna():
ca.infoa(cb)deffunb():
cb.infob(ca)#函式呼叫不是執行緒,不會死鎖#funa()#funb()
t1=threading.thread(target=funa).start()
t2=threading.thread(target=funb).start()
說明:執行緒|狀態
classa
獲得classa的鎖,sleep(classa的鎖未釋放)
申請classb的鎖
死鎖classb
獲得classb的鎖,sleep(classb的鎖未釋放)
申請classa的鎖
死鎖
python死鎖案例 Python 多執行緒死鎖
場景是這樣的 開啟多個執行緒訪問外部 api 過一段時間,發現所有執行緒死鎖。環境 python2.6.7 centos7.1 urllib2 suse 下無此問題。dump 如下 thread 161 thread 0x7f80de4e9700 lwp 12459 0 0x00007f80e4ca...
死鎖案例分析
死鎖的產生以及解決辦法,看 分析,注意裡邊的注釋,自行執行。package thread 模擬買票 author yhl class thread02 implements runnable else 同步 塊 public void sale catch interruptedexception ...
死鎖的案例
死鎖就是當有兩個或兩個以上的執行緒都獲得對方的資源,但彼此有不肯放開,處於僵持狀態,此時便造成了死鎖 package cn.et.deadlock public class deadlock implements runnable catch interruptedexception e synch...