- Lock
加入锁Lock之后,在lock.acquire()和lock.release()之间的代码是线程安全的
total=0 lock=Lock() def add(): #1. dosomething1 #2. io操作 #3. dosomething3 global total for i in range(1000000): lock.acquire() #加锁 total +=1 lock.release() #释放 def desc(): global total for i in range(1000000): lock.acquire() #加锁 total -=1 lock.release() #释放 import threading thread1=threading.Thread(target=add) thread2=threading.Thread(target=desc) thread1.start() thread2.start() thread1.join() thread2.join() print(total) #结果:0
- 用锁会影响性能
- 锁会引起死锁
引起死锁的情况1
lock.acquire() lock.acquire() #在lock未释放,又加锁,就引起了死锁 # do something lock.release()
引起死锁的情况2
#使用伪代码说明 A需要变量a和b,B需要变量a和b A首先对a加锁,B对b加锁,A需要b,但是已经被B加锁,那么A无法对b加锁,导致了死锁 A(a,b) acquire(a) acquire(b) B(a, b) acquire(b) acquire(a)
2.RLock:在同一个线程里面,可以连续调用多次acquire,一定要注意acquire的次数要和release的次数相等
代码如上,只要把Lock改成RLock即可,这样可以解决Lock死锁情况1的问题
lock=Lock() ----> lock=RLock()
文章来源: 11-4 线程同步 - Lock、RLock