java - 关于i++的一个题目
本文介绍了java - 关于i++的一个题目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
使用2条线程对i=1进行自增(i++),每条线程各自执行100次,请问可能的最大值和最小值是多少?请给出解释
另外问问,++i是否是原子性的?
解决方案
最小可以是 3,即 +2,最大 201,即 +200 。。。。为什么 i 不从 0 开始。。。
一次循环过程是:
从内存读取数据到寄存器
寄存器值++
写回数据到内存
一个线程可能在这三步中的任意一步被打断。是3的情况是:
第一线程读取数据1
,然后被挂起,寄存器的值被保存到另一个地方。
第二个线程,持续执行了 99 次(此时,内存中的值为 100
),然后被挂起。
第一个线程被唤醒,恢复寄存器的 1
+1 之后 (=2
)被写回内存,该线程被挂起
第二个线程从内存读取2
到寄存器之后被挂起
第一个全部执行完,把值写回内存
唤起第二个线程,恢复寄存器中的2
,完成最后一次循环+1 之后写回 3
所以最终结果是 3
。。。。
还没有想到更小的调度方式。。。
最大值就不用过多解释了。。。。
这篇关于java - 关于i++的一个题目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文