1 """
2 死锁
3 要AB两个锁
4 当A锁内部需要使用B锁,同时B锁内部需要使用A锁的时候,就要可能会出现死锁
5
6 出现死所的解决方法:
7 1.重构代码
8 2.添加timeout时间
9
10 下面代码中要可能返回下面内容,在同时认为锁被对方占用,同时释放
11 Thread-1获取到a锁
12 Thread-2获取到b锁
13 over
14
15 """
16 import time
17 from threading import Thread, Lock
18
19 lock_a = Lock()
20 lock_b = Lock()
21
22
23 class MyThread(Thread):
24 def run(self) -> None:
25 if lock_a.acquire(): # 如果a锁可以获取到,返回True,获取不到就阻塞
26 print(self.name + "获取到a锁")
27 time.sleep(0.1)
28 if lock_b.acquire(timeout=0.01): # 这里不加退出时间就会要可能出现死锁
29 print(self.name + "获取到b锁,现有ab锁")
30 lock_b.release()
31 lock_a.release()
32
33
34 class MyThread1(Thread):
35 def run(self) -> None:
36 if lock_b.acquire(): # 如果b锁可以获取到,返回True,获取不到就阻塞
37 print(self.name + "获取到b锁")
38 time.sleep(0.1)
39 if lock_a.acquire(timeout=0.01): # 这里不加退出时间就会要可能出现死锁
40 print(self.name + "获取到a锁,现有ab锁")
41 lock_a.release()
42 lock_b.release()
43
44
45 if __name__ == '__main__':
46 t1 = MyThread()
47 t2 = MyThread1()
48
49 t1.start()
50 t2.start()
51 t1.join()
52 t2.join()
53
54 print("over")