Java多线程竞态条件问题:求解num的最小与最大值
Java多线程场景下num的最小与最大值分析
给定你提供的Java代码,我们可以分析出标记***的行输出num的取值范围:
最终结论
- 最大值:10240
- 最小值:2046
详细分析
代码核心逻辑
每个线程会依次执行addOne(对num加1)和multiTwo(对num乘2),两个方法都通过synchronized(lock)保证原子性,且使用同一个锁对象,因此同一时间只有一个线程能执行addOne或multiTwo的同步块代码。但addOne和multiTwo之间没有锁保护,线程执行完addOne释放锁后,可能被其他线程抢占执行。
最大值的推导
当所有线程的addOne操作先全部执行完毕,再执行所有multiTwo操作时,num会达到最大值:
- 初始
num=0,10次addOne执行后,num=0+10=10 - 接着执行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
相关产品推荐
相关产品推荐

