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