一、什么是死锁
【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()