java - 關於i++的一個題目
phpcn_u1582
phpcn_u1582 2017-05-17 10:00:27
0
2
596

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

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

phpcn_u1582
phpcn_u1582

全部回覆(2)
洪涛

最小可以是 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

所以最終結果是 🎜。 。 。 。 🎜 🎜還沒有想到更小的調度方式。 。 。 🎜 🎜最大值就不用太多解釋了。 。 。 。 🎜
Ty80

最小值為2,最大值為200。
2就是兩個執行緒都在CPU快取修改數據,最後記憶體只刷新了一次
200 就是兩個執行緒交替讀取並修改,互相不競爭。
都問最大值最小值了,自然不是原子性的。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板