一 . 死锁
代码示例
from threading import Thread,Lock,RLock
import time
mutexA=Lock()
mutexB=Lock()
# mutexB=mutexA=RLock()
class Mythead(Thread):
def run(self):
self.f1()
self.f2()
def f1(self):
mutexA.acquire()
print('%s 抢到A锁' %self.name)
mutexB.acquire()
print('%s 抢到B锁' %self.name)
mutexB.release()
mutexA.release()
def f2(self):
mutexB.acquire()
print('%s 抢到了B锁' %self.name)
time.sleep(2)
mutexA.acquire()
print('%s 抢到了A锁' %self.name)
mutexA.release()
mutexB.release()
if __name__ == '__main__':
for i in range(5):
t=Mythead()
t.start()
运行效果
Thread-1 抢到A锁
Thread-1 抢到B锁
Thread-1 抢到了B锁
Thread-2 抢到A锁
原因:
线程一手里拿着B锁的钥匙,但线程一想要继续执行代码必须要得到A锁的钥匙,
而 线程二手里拿着A锁的钥匙,想要继续执行代码却必须要得到B锁的钥匙.进而陷入了一个死结,即死锁
解决方法
就是尽量不自己进行加锁处理
如果必须使用锁,则可以用递归锁来解决
二. 递归锁
代码如下:
from threading import Thread,Lock,RLock
import time
# mutexA=Lock()
# mutexB=Lock()
mutexB=mutexA=RLock()
class Mythead(Thread):
def run(self):
self.f1()
self.f2()
def f1(self):
mutexA.acquire()
print('%s 抢到A锁' %self.name)
mutexB.acquire()
print('%s 抢到B锁' %self.name)
mutexB.release()
mutexA.release()
def f2(self):
mutexB.acquire()
print('%s 抢到了B锁' %self.name)
time.sleep(2)
mutexA.acquire()
print('%s 抢到了A锁' %self.name)
mutexA.release()
mutexB.release()
if __name__ == '__main__':
for i in range(5):
t=Mythead()
t.start()
运行结果
Thread-1 抢到A锁
Thread-1 抢到B锁
Thread-1 抢到了B锁
Thread-1 抢到了A锁
Thread-2 抢到A锁
Thread-2 抢到B锁
Thread-2 抢到了B锁
Thread-2 抢到了A锁
Thread-4 抢到A锁
Thread-4 抢到B锁
Thread-4 抢到了B锁
Thread-4 抢到了A锁
Thread-3 抢到A锁
Thread-3 抢到B锁
Thread-3 抢到了B锁
Thread-3 抢到了A锁
Thread-5 抢到A锁
Thread-5 抢到B锁
Thread-5 抢到了B锁
Thread-5 抢到了A锁
Process finished with exit code 0
运行结果显示,在使用了递归锁的情况下代码完美运行,并没有阻塞现象产生
在我们进行开发的过程尽量避免自己进行加锁处理,这样可以减少很多bug的产生
网友评论