不加锁
import threading
num = 0
def test():
global num
for i in range(10000000):
num -= 100
num += 100
if __name__ == '__main__':
thread1 = threading.Thread(target=test)
thread2 = threading.Thread(target=test)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("num=",num)
每次测试输出结果都不一样,因为产生了脏读,而脏读是我们不能容忍的,这里需要加锁.
加锁
import threading
num = 0
mylock = threading.Lock()
def test1():
global num
for i in range(10000000):
#加锁防止脏读的出现 在这里必须在try语句中 防止出现异常没有解锁 出现死锁 导致兄弟线程挂起
try:
mylock.acquire()
num -= 100
num += 100
finally:
mylock.release()
def test2():
global num
for i in range(10000000):
#加锁防止脏读的出现 在这里必须在try语句中 防止出现异常没有解锁 出现死锁 导致兄弟线程挂起
with mylock:
num -= 100
num += 100
if __name__ == '__main__':
thread1 = threading.Thread(target=test2)
thread2 = threading.Thread(target=test2)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("num=",num)
这里test01和test02都可以解决脏读,推荐使用test02的写法,代码更加简洁.