首页  >  问答  >  正文

java - 关于i++的一个题目

使用2条线程对i=1进行自增(i++),每条线程各自执行100次,请问可能的最大值和最小值是多少?请给出解释

另外问问,++i是否是原子性的?

phpcn_u1582phpcn_u15822712 天前567

全部回复(2)我来回复

  • PHP中文网

    PHP中文网2017-05-17 10:02:27

    最小可以是 3,即 +2,最大 201,即 +200 。。。。为什么 i 不从 0 开始。。。

    一次循环过程是:

    1. 从内存读取数据到寄存器

    2. 寄存器值++

    3. 写回数据到内存

    一个线程可能在这三步中的任意一步被打断。是3的情况是:
    第一线程读取数据1,然后被挂起,寄存器的值被保存到另一个地方。1,然后被挂起,寄存器的值被保存到另一个地方。
    第二个线程,持续执行了 99 次(此时,内存中的值为 100),然后被挂起。
    第一个线程被唤醒,恢复寄存器的 1 +1 之后 (=2)被写回内存,该线程被挂起
    第二个线程从内存读取2到寄存器之后被挂起
    第一个全部执行完,把值写回内存
    唤起第二个线程,恢复寄存器中的2第二个线程,持续执行了 99 次(此时,内存中的值为 100),然后被挂起。

    第一个线程被唤醒,恢复寄存器的 1 +1 之后 (=2)被写回内存,该线程被挂起3第二个线程从内存读取2到寄存器之后被挂起

    第一个全部执行完,把值写回内存

    唤起第二个线程,恢复寄存器中的2,完成最后一次循环+1 之后写回 3

    所以最终结果是 🎜。。。。🎜 🎜还没有想到更小的调度方式。。。🎜 🎜最大值就不用过多解释了。。。。🎜

    回复
    0
  • PHP中文网

    PHP中文网2017-05-17 10:02:27

    最小值为2,最大值为200。
    2就是两个线程都在CPU缓存修改数据,最终内存只刷新了一次
    200 就是两个线程交替读取并修改,互相不竞争。
    都问最大值最小值了,自然不是原子性的。

    回复
    0
  • 取消回复