互斥锁

  • 锁有两种状态——锁定和未锁定。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”状态,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

  • 使用 Thread 对象的 Lock 可以实现简单的线程同步,有上锁 acquire 方法和 释放release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire release 方法之间。

  •  1 import time
     2 from threading import Thread,Lock
     3 #定义全局变量num
     4 num=0
     5 #创建一把互斥锁
     6 lock = Lock()
     7 def test1():
     8     global num
     9     '''
    10     在两个线程中都调用上锁的方法,则这两个线程就会抢着上锁,
    11     如果有1方成功上锁,那么导致另外一方会堵塞(一直等待)直到这个锁被解开
    12     '''
    13     lock.acquire()#上锁
    14     for i in range(100000):
    15         num+=1
    16     lock.release()
    17     print('test1输出num:',num)
    18 
    19 def test2():
    20     global num
    21     lock.acquire()  # 上锁
    22     for i in range(100000):
    23         num+=1
    24     lock.release()
    25     print('test2输出num:',num)
    26 
    27 if __name__=='__main__':
    28     t1 = Thread(target=test1)
    29     t2 = Thread(target=test2)
    30     t1.start()
    31     t2.start()
    32     t1.join()
    33     t2.join()
    1 test1输出num: 100000
    2 test2输出num: 200000

     

posted @ 2020-04-11 22:41  小他_W  阅读(157)  评论(0编辑  收藏  举报