首頁  >  問答  >  主體

java - 關於i++的一個題目

使用2個執行緒對i=1進行自增(i ),每個執行緒各自執行100次,請問可能的最大值和最小值是多少?請給出解釋

另外問, i是否是原子性的?

phpcn_u1582phpcn_u15822712 天前564

全部回覆(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
  • 取消回覆