1,多线程无锁情况下
import threading import time balance = 0 def change_it(n): global balance balance = balance + n balance = balance - n def run_thread(n): for i in range(10000): change_it(n) t1 = threading.Thread(target = run_thread, args = (5, )) //创建一个线程t1 t2 = threading.Thread(target = run_thread, args = (8, )) //创建一个线程t2 t1.start() //开启线程 t2.start() t1.join() //等待线程结束 t2.join() print(balance) 打印结果理论上是0,实际上不确定,因为线程t1和线程t2存在竞争资源的情况,导致结果的不确定性,可以多运行几次来观察结果 2,给资源加锁import threading import time balance = 0 lock = threading.Lock() //创建锁 def change_it(n): global balance balance = balance + n balance = balance - n def run_thread(n): for i in range(10000): lock.acquire() //使用锁 change_it(n) lock.release() //释放锁 t1 = threading.Thread(target = run_thread, args = (5, )) t2 = threading.Thread(target = run_thread, args = (8, )) t1.start() t2.start() t1.join() t2.join() print(balance)由于多线程是不安全的,有必要给资源加锁,打印结果必定是0