递归锁(RLock)

'''递归锁(RLock)'''
import threading
import time

# class MyThread(threading.Thread):
#  def actionA(self):
#     A.acquire()
#     print(self.name, 'gotA', time.ctime())
#     time.sleep(2)
#
#     B.acquire()
#     print(self.name, 'gotB', time.ctime())
#     time.sleep(1)
#
#     B.release()
#     A.release()
#
#  def actionB(self):
#     B.acquire()
#     print(self.name, 'gotB', time.ctime())
#     time.sleep(2)
#
#     A.acquire()
#     print(self.name, 'gotA', time.ctime())
#     time.sleep(1)
#
#     A.release()
#     B.release()
#
#  def run(self):
#     '''继承的方式,必须重写run方法'''
#     self.actionA()
#     time.sleep(1)
#     self.actionB()
#
# if __name__ == '__main__':
#  A = threading.Lock()
#  B = threading.Lock()
#  l = []
#
#  for i in range(5):
#     t = MyThread()
#     t.start()
#     l.append(t)
#
#  for i in l:
#     i.join()
#
#  print('ending...')
# 死锁:第一个线程执行完actionA时,把A和B两把锁也释放了,而且第二个线程也开始执行actionA,第一个线程则执行actionB;第一个线程拿到了B锁,第二个线程
# 拿到了A锁,第一个线程需要拿到A锁,而第二个线程也需要拿到B锁,此时就出现了死锁的现象,程序卡住无法继续往下执行


class MyThread_1(threading.Thread):
   def actionA(self):
      r_lock.acquire() # count=1
      print(self.name, 'gotA', time.ctime())
      time.sleep(2)

      r_lock.acquire() # count=2
      print(self.name, 'gotB', time.ctime())
      time.sleep(1)

      r_lock.release() # count=1
      r_lock.release() # count=0

   def actionB(self):
      r_lock.acquire()
      print(self.name, 'gotB', time.ctime())
      time.sleep(2)

      r_lock.acquire()
      print(self.name, 'gotA', time.ctime())
      time.sleep(1)

      r_lock.release()
      r_lock.release()

   def run(self):
      self.actionA()
      self.actionB()

if __name__ == '__main__':
   r_lock = threading.RLock() # RLock(),内部实现以count计数为准,当count大于0,那么锁无法被抢夺
   l = []

   for i in range(5):
      t = MyThread_1()
      t.start()
      l.append(t)

   for i in l:
      i.join()

   print('ending...')
# 当一个线程在执行中使用了RLock()锁,那么锁没有被完全释放是不会出现被抢占的情况;比如:第一个线程执行完actionA后,把锁释放完了,此时本还需要
# 继续执行actionB,可是锁释放完毕没有谁在用,那么剩下的4个线程都可以去争夺这个锁去执行,所以每当线程上了RLock()锁后,只有当这个线程释放完RLock()
# 锁才能进行线程的切换
while True: print('studying...')
原文地址:https://www.cnblogs.com/xuewei95/p/14859925.html