You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多线程无同步时同时读写同一变量会产生什么问题?

无同步机制下线程并发读写/更新变量的行为分析

当读取操作发生在更新操作之前或之后时,结果一目了然,但两者并发执行且未使用任何同步机制时,就会出现未定义行为,具体分两种场景来看:

1. 一个线程读取变量,另一个线程同时更新变量

以你给出的代码为例,thread1负责把value设为5,thread2负责读取并打印value:

from threading import Thread

value = 0

def thread1():
    global value
    value = 5

def thread2():
    global value
    print(value)

if __name__ == "__main__":
    thread1 = Thread(target=thread1)
    thread2 = Thread(target=thread2)
    thread1.start()
    thread2.start()

运行这段代码,可能出现两种结果:

  • 打印0:说明线程调度让thread2的读取操作先完成,thread1的赋值还没生效
  • 打印5:说明thread1的赋值操作先执行完毕,thread2读到了更新后的值

要注意的是,Python中对单个整数的赋值是原子操作,不会出现“读到一半的中间值”(比如既不是0也不是5的情况),但线程的执行顺序完全由操作系统调度决定,每次运行结果都可能不同。

2. 两个线程同时更新变量

如果把thread2里的注释打开,让它也对value赋值(比如设为10),此时两个线程同时修改同一个变量:

from threading import Thread

value = 0

def thread1():
    global value
    value = 5

def thread2():
    global value
    value = 10

if __name__ == "__main__":
    thread1 = Thread(target=thread1)
    thread2 = Thread(target=thread2)
    thread1.start()
    thread2.start()

这种场景下,最终value的结果要么是5,要么是10,取决于哪个线程的赋值操作最后完成。同样因为整数赋值是原子操作,不会出现混合两个赋值的异常值,但结果依然不可预测。

总结

这种无同步的并发操作属于数据竞争场景,线程间的执行顺序没有任何保证,结果完全依赖操作系统的调度。如果需要确定的行为,必须使用同步机制,比如threading.Lock(),确保同一时间只有一个线程访问或修改共享变量。

内容的提问来源于stack exchange,提问作者user19551894

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:10:31