小白学python--------------死锁现象与递归锁

死锁现象

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() 

猜你喜欢

转载自blog.csdn.net/qq_42721964/article/details/82497018