python多线程之线程同步--锁
1 ''' 2 线程同步---锁 3 不同线程操作某一个对象时,容易出现数据不完整或者不一致! 4 解决方案:加锁。在线程需要独占资源的时候,获取锁; 5 线程不需要独占资源的时候,释放锁,别的线程可以获取锁; 6 7 锁的目的:确保多个线程不会同时操作同一个资源,确保数据完整性和一致性; 8 同时,又保证了资源可以在不同线程之间轮转 9 锁的获取和释放的位置不合适,会引起线程阻塞或者死锁。 10 用到就获取,用完即释放。 11 ''' 12 # encoding: utf-8 13 14 import threading 15 import time 16 17 a = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 18 19 lock = threading.Lock() 20 21 22 class MyThread_Set1(threading.Thread): 23 24 def __init__(self, thid=None, thname=None, step=0.1): 25 # super().__init__(self) 26 threading.Thread.__init__(self) 27 self.step = step 28 self.thid = thid 29 self.thname = thname 30 31 def run(self): 32 print('%s开始' % self.thname) 33 lock.acquire() # 获取锁 34 for i in range(len(a)): 35 a[i] = 1 36 time.sleep(0.1) 37 38 print(a) 39 lock.release() # 释放锁 40 print('%s结束' % self.thname) 41 42 43 class MyThread_Set2(threading.Thread): 44 45 def __init__(self, thid=None, thname=None, step=0.1): 46 threading.Thread.__init__(self) # threading.Thread.__init__(self) 中的thread不要加() 47 self.step = step 48 self.thid = thid 49 self.thname = thname 50 51 def run(self): 52 print('%s开始' % self.thname) 53 lock.acquire() # 获取锁 54 for i in range(-1, -len(a)-1, -1): 55 a[i] = 2 56 time.sleep(0.1) 57 58 print(a) 59 lock.release() # 释放锁 60 print('%s结束' % self.thname) 61 62 print("主线程开始") 63 th1 = MyThread_Set1(thname='线程1') 64 th2 = MyThread_Set2(thname='线程2') 65 66 th2.start() 67 th1.start() 68 69 th1.join() 70 th2.join() 71 print("主线程结束")