文章詳情頁
java - 關于i++的一個題目
瀏覽:132日期:2023-12-13 18:10:01
問題描述
使用2條線程對i=1進行自增(i++),每條線程各自執(zhí)行100次,請問可能的最大值和最小值是多少?請給出解釋
另外問問,++i是否是原子性的?
問題解答
回答1:最小可以是 3,即 +2,最大 201,即 +200 。。。。為什么 i 不從 0 開始。。。
一次循環(huán)過程是:
從內存讀取數(shù)據(jù)到寄存器
寄存器值++
寫回數(shù)據(jù)到內存
一個線程可能在這三步中的任意一步被打斷。是3的情況是:第一線程讀取數(shù)據(jù)1,然后被掛起,寄存器的值被保存到另一個地方。第二個線程,持續(xù)執(zhí)行了 99 次(此時,內存中的值為 100),然后被掛起。第一個線程被喚醒,恢復寄存器的 1 +1 之后 (=2)被寫回內存,該線程被掛起第二個線程從內存讀取2到寄存器之后被掛起第一個全部執(zhí)行完,把值寫回內存喚起第二個線程,恢復寄存器中的2,完成最后一次循環(huán)+1 之后寫回 3
所以最終結果是 3。。。。
還沒有想到更小的調度方式。。。
最大值就不用過多解釋了。。。。
回答2:最小值為2,最大值為200。2就是兩個線程都在CPU緩存修改數(shù)據(jù),最終內存只刷新了一次200 就是兩個線程交替讀取并修改,互相不競爭。都問最大值最小值了,自然不是原子性的。
標簽:
java
相關文章:
1. javascript - 如何使用nodejs 將.html 文件轉化成canvas2. 如何解決docker宿主機無法訪問容器中的服務?3. angular.js - 輸入郵箱地址之后, 如何使其自動在末尾添加分號?4. javascript - Web微信聊天輸入框解決方案5. 在mac下出現(xiàn)了兩個docker環(huán)境6. javascript - 后臺管理系統(tǒng)左側折疊導航欄數(shù)據(jù)較多,怎么樣直接通過搜索去定位到具體某一個菜單項位置,并展開當前菜單7. java如何生成token?8. python - Scrapy存在內存泄漏的問題。9. CSS3 畫如下圖形10. angular.js - $stateChangeSuccess事件在狀態(tài)跳轉的時候不執(zhí)行?
排行榜

熱門標簽