同步锁和递归锁
同步锁
# from threading import Thread # import os,time # def work(): # global num # temp=num # time.sleep(0.1) #多线程碰到IO,切换其他线程 # num=temp-1 # num=100 # l=[] # # if __name__ == '__main__': # # for i in range(100): # p=Thread(target=work) # l.append(p) # p.start() # for p in l: # p.join() # # print(num) #结果为99 import threading import os,time def work(): global num lock.acquire() temp=num time.sleep(0.1) #有了同步锁,此时sleep也不能切换其他线程了 num=temp-1 lock.release() num=100 l=[] lock=threading.Lock() if __name__ == '__main__': for i in range(100): p=threading.Thread(target=work) l.append(p) p.start() for p in l: p.join() print(num) #结果为0,因为加了同步锁
递归锁
# import threading,time # # class MyThread(threading.Thread): # def actionA(self): # A.acquire() # print(self.name,"got A",time.ctime()) # time.sleep(2) # # B.acquire() # print(self.name,"got B",time.ctime()) # time.sleep(1) # B.release() # A.release() # #第一个线程执行玩actionA,打印了gotA gotB,接着就跑去执行actionB,开启了B锁,接着需要A锁 # #此时第二个线程就执行了actionA,开启了A锁,接着需要B锁 # #在这种情况下就变成了死锁了,一直僵硬下去 # def actionB(self): # B.acquire() # print(self.name,"got B",time.ctime()) # time.sleep(2) # A.acquire() # print(self.name, "got A", time.ctime()) # time.sleep(1) # A.release() # B.release() # # def run(self): # self.actionA() # self.actionB() # # if __name__ == '__main__': # A=threading.Lock() # B=threading.Lock() # # L=[] # for i in range(5): #5个线程 # t=MyThread() # t.start() # L.append(t) # for i in L: # i.join() # # print("ending...") #递归锁:rLock=threading.RLock() import threading,time class MyThread(threading.Thread): def actionA(self): rLock.acquire() print(self.name,"got A",time.ctime()) time.sleep(2) rLock.acquire() print(self.name,"got B",time.ctime()) time.sleep(1) rLock.release() rLock.release() def actionB(self): rLock.acquire() print(self.name,"got B",time.ctime()) time.sleep(2) rLock.acquire() print(self.name, "got A", time.ctime()) time.sleep(1) rLock.release() rLock.release() def run(self): self.actionA() self.actionB() if __name__ == '__main__': rLock=threading.RLock() #只有一把锁 L=[] for i in range(5): #5个线程 t=MyThread() t.start() L.append(t) for i in L: i.join() print("ending...")
浙公网安备 33010602011771号