python-死鎖和遞迴鎖(可重複鎖)
阿新 • • 發佈:2022-05-12
一、什麼是死鎖
【1】兩個執行緒同時佔有某個資源,並且同時等待對方的資源,就會造成死鎖
# -*- coding:utf-8 -*- # __author__: # 2022/5/12 import threading,time #A向B要錢,B向A要貨物,A要讓B先給,B讓A先給,兩者造成死鎖 # 建立鎖A lockA = threading.Lock() # 建立鎖B lockB = threading.Lock() def A(): # 鎖住 lockA.acquire() print('先給我錢') time.sleep(1) # 部分資源被B鎖住 lockB.acquire() print('先給我貨物') time.sleep(1) # 解鎖 lockB.release() lockA.release() def B(): # 鎖住 lockB.acquire() print('先給我貨物') time.sleep(1) #A佔有部分資源 # 部分資源被B鎖住 lockA.acquire() print('先給我錢') time.sleep(1) # 建立兩個執行緒 t1 = threading.Thread(target=A) t2 = threading.Thread(target=B) # 啟動執行緒 t1.start() t2.start() # 輸出: # 先給我錢 # 先給我貨物
【2】遞迴鎖:內建lock和count
# 遞迴鎖內有lock和count計數器,上鎖1次count+1,解鎖1次count-1,count必須>=0
# 遞迴鎖在一定程度上安全性比同步鎖要低,所以一般在讀的時候用遞迴鎖,寫的時候用同步鎖,提升效率
# -*- coding:utf-8 -*- # __author__:pansy # 2022/5/12 # 遞迴鎖內有lock和count計數器,上鎖1次count+1,解鎖1次count-1,count必須>=0 # 遞迴鎖在一定程度上安全性比同步鎖要低,所以一般在讀的時候用遞迴鎖,寫的時候用同步鎖,提升效率 # 建立遞迴鎖 import threading,time rLock = threading.RLock() def A(): # 鎖住 rLock.acquire() # count+1 print('先給我錢') time.sleep(1) # 部分資源被B鎖住 rLock.acquire() # count+1 print('先給我貨物') time.sleep(1) # 解鎖 rLock.release() # count-1 rLock.release() # count-1 def B(): # 鎖住 rLock.acquire() print('先給我貨物') time.sleep(1) #A佔有部分資源 # 部分資源被B鎖住 rLock.acquire() print('先給我錢') time.sleep(1) # 建立兩個執行緒 t1 = threading.Thread(target=A) t2 = threading.Thread(target=B) # 啟動執行緒 t1.start() t2.start()