面试题:无同步下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
相关产品推荐
相关产品推荐

