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

Java多线程竞态条件问题:求解num的最小与最大值

Java多线程场景下num的最小与最大值分析

给定你提供的Java代码,我们可以分析出标记***的行输出num的取值范围:

最终结论

  • 最大值:10240
  • 最小值:2046

详细分析

代码核心逻辑

每个线程会依次执行addOne(对num加1)和multiTwo(对num乘2),两个方法都通过synchronized(lock)保证原子性,且使用同一个锁对象,因此同一时间只有一个线程能执行addOne或multiTwo的同步块代码。但addOne和multiTwo之间没有锁保护,线程执行完addOne释放锁后,可能被其他线程抢占执行。

最大值的推导

当所有线程的addOne操作先全部执行完毕,再执行所有multiTwo操作时,num会达到最大值:

  1. 初始num=0,10次addOne执行后,num=0+10=10
  2. 接着执行10次multiTwo,每次将当前值乘2,最终结果为10 * 2^10 = 10240

最小值的推导

当每个线程的addOne和multiTwo操作连续执行(执行完addOne后立即获取锁执行multiTwo,未被其他线程打断),num会得到最小值:
计算过程为嵌套执行(((((((((0+1)*2)+1)*2)+1)*2)+1)*2)+1)*2)+1)*2)+1)*2)+1)*2,最终结果为2046。

关于你认为最小值为2的误区

你提到认为最小值是2,但实际上代码中通过join()方法等待所有10个线程执行完毕,每个线程都会执行一次addOne和multiTwo,因此num不可能只停留在2(仅单个线程执行完成的结果),所有线程的操作都会对num产生修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 07:32:13