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

面试题:无同步下2线程对int变量自增200次的最值求解

无同步双线程自增int变量的最大/最小值分析

嘿,这个并发面试题挺经典的,咱们先把前提理清楚:假设变量初始值为N,两个线程各自独立执行200次i++操作,全程无任何同步机制(比如锁、volatile等)。下面直接给结论,再拆解原因:

最大值:N + 400

这是最理想的情况——两个线程的所有自增操作完全没有冲突。比如线程A先完整执行完200次自增,线程B再接着执行200次;或者虽然线程交替执行,但每次i++的读取-修改-写入三个原子子步骤都没被打断,所有操作都成功生效。此时变量总共被自增400次,结果就是初始值加400。

最小值:N + 200

这是最极端的冲突场景,本质是其中一个线程的所有自增操作都被另一个线程的操作“覆盖”,完全没有对最终值产生贡献。

要理解这个情况,得先明确:i++不是原子操作,它会拆成三个步骤:

  • 从内存读取当前i的值到寄存器
  • 寄存器中的值加1
  • 将新值写回内存

无同步时,线程调度可能随时打断这三个步骤。举个极端例子:

  • 线程A每次执行i++时,刚完成读取旧值的步骤,就被调度暂停
  • 线程B趁机完成一次完整的i++(读取旧值→加1→写回内存)
  • 线程A恢复执行,把自己读取的旧值+1写回内存,直接覆盖了线程B刚才的修改

如果这种情况重复200次,线程A的每一次自增都相当于“无效操作”——每次都把线程B的修改覆盖回去,最终只有线程B的200次自增生效,变量值就是N + 200。

补充一句:实际运行中可能很难遇到这么极端的情况,但从理论和并发模型的角度,这是可能出现的最小值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:27:42