python-死锁和递归锁(可重复锁)
一、什么是死锁
【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()