线程同步即使用锁来避免多线程程序中对共享资源的竞争导致错误。
例如下面经典的加一减一多线程操作
value=0
def op_without_lock():
global value
for i in range(100000):
value=value+1
value=value-1
import threading
t1=threading.Thread(target=op_without_lock)
t2=threading.Thread(target=op_without_lock)
t1.start()
t2.start()
t1.join()
t2.join()
print(value)
多线程对资源的访问顺序,是操作系统随机自行决定的,因为执行循顺序的不同,会导致每次的计算结果都可能不同。
引入线程锁的技术,保证在同一时间内只有一个线程能够获取到锁,从而避免线程竞争导致的错误。
import threading
value=0
lock=threading.Lock()
def op_without_lock():
global value
for i in range(100000):
lock.acquire()
value=value+1
value=value-1
lock.release()
#如果忘记释放锁,会导致其它线程一直不能获得资源,程序一直不能完成,造成死锁。
t1=threading.Thread(target=op_without_lock)
t2=threading.Thread(target=op_without_lock)
t1.start()
t2.start()
t1.join()
t2.join()
print(value)
Lock对象会和with语句一起使用,这使得代码简洁的同时也可以避免使用锁之后忘记释放而引起错误。