死锁现象
from threading import Thread, Lock,active_count
import time
mutexA = Lock()
mutexB = Lock()
class Mythread(Thread):
def run(self):
self.f1()
self.f2()
def f1(self):
mutexA.acquire()
print('%s 拿到A锁' % self.name) # Thread-1 先拿到A锁
mutexB.acquire() # Thread-1 再拿到B锁,此时其他线程再等着抢A锁
print('%s 拿到B锁' % self.name)
mutexB.release() # Thread-1 先释放B锁
mutexA.release() # Thread-1 再释放A锁
def f2(self):
mutexB.acquire()
print('%s 拿到B锁' % self.name) # Thread-1 再次拿到B锁,因为其他线程再抢A锁
time.sleep(1) #关键在这里
#1秒钟时间足够其他线程起来了,并抢到A锁了,此时Thread-2拿到A锁,然后等着抢B锁,而Thread-1已经拿到B锁,等着抢A锁,导致死锁现象
mutexA.acquire()
print('%s 拿到A锁' % self.name)
mutexA.release()
mutexB.release()
if __name__ == '__main__':
for i in range(5):
t = Mythread()
t.start() # 5个线程很快就启动起来了,但是依然是有一点点时间差的
#结果
# Thread-1 拿到A锁
# Thread-1 拿到B锁
# Thread-1 拿到B锁
# Thread-2 拿到A锁
递归锁
from threading import Thread,active_count,RLock
import time
'''
RLock===>递归锁,身上有计数,为0时所有线程都可以抢
当一个线程抢到时,每次acquire计数+1,每次release计数-1
递归锁特点可以连续的acquire
'''
obj = RLock()
mutexA = obj
mutexB = obj
class Mythread(Thread):
def run(self):
self.f1()
self.f2()
def f1(self):
mutexA.acquire()
print('%s 拿到A锁' % self.name) # Thread-1 先拿到一次锁 count=1
mutexB.acquire() # Thread-1 再拿到一次锁 count=2
print('%s 拿到B锁' % self.name)
mutexB.release() # Thread-1 先释放一次锁 count=1
mutexA.release() # Thread-1 再释放一次锁 count=0
def f2(self):
mutexB.acquire()
print('%s 拿到B锁' % self.name) # Thread-1 又抢到了锁 count=1
time.sleep(1)
mutexA.acquire()
print('%s 拿到A锁' % self.name) # Thread-1 再次拿到一次锁 count=2
mutexA.release() # Thread-1 先释放一次锁 count=1
mutexB.release() # Thread-1 再释放一次锁 count=0,这时其他线程可以抢锁了
if __name__ == '__main__':
for i in range(5):
t = Mythread()
t.start()