同步锁和递归锁

同步锁

# 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,因为加了同步锁
View Code

 

递归锁

# 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...")
View Code

 

posted @ 2019-05-08 23:40  rayh  阅读(92)  评论(0)    收藏  举报