java - 關(guān)于i++的一個(gè)題目
問(wèn)題描述
使用2條線程對(duì)i=1進(jìn)行自增(i++),每條線程各自執(zhí)行100次,請(qǐng)問(wèn)可能的最大值和最小值是多少?請(qǐng)給出解釋
另外問(wèn)問(wèn),++i是否是原子性的?
問(wèn)題解答
回答1:最小可以是 3,即 +2,最大 201,即 +200 。。。。為什么 i 不從 0 開(kāi)始。。。
一次循環(huán)過(guò)程是:
從內(nèi)存讀取數(shù)據(jù)到寄存器
寄存器值++
寫回?cái)?shù)據(jù)到內(nèi)存
一個(gè)線程可能在這三步中的任意一步被打斷。是3的情況是:第一線程讀取數(shù)據(jù)1,然后被掛起,寄存器的值被保存到另一個(gè)地方。第二個(gè)線程,持續(xù)執(zhí)行了 99 次(此時(shí),內(nèi)存中的值為 100),然后被掛起。第一個(gè)線程被喚醒,恢復(fù)寄存器的 1 +1 之后 (=2)被寫回內(nèi)存,該線程被掛起第二個(gè)線程從內(nèi)存讀取2到寄存器之后被掛起第一個(gè)全部執(zhí)行完,把值寫回內(nèi)存喚起第二個(gè)線程,恢復(fù)寄存器中的2,完成最后一次循環(huán)+1 之后寫回 3
所以最終結(jié)果是 3。。。。
還沒(méi)有想到更小的調(diào)度方式。。。
最大值就不用過(guò)多解釋了。。。。
回答2:最小值為2,最大值為200。2就是兩個(gè)線程都在CPU緩存修改數(shù)據(jù),最終內(nèi)存只刷新了一次200 就是兩個(gè)線程交替讀取并修改,互相不競(jìng)爭(zhēng)。都問(wèn)最大值最小值了,自然不是原子性的。
相關(guān)文章:
1. 在mybatis使用mysql的ON DUPLICATE KEY UPDATE語(yǔ)法實(shí)現(xiàn)存在即更新應(yīng)該使用哪個(gè)標(biāo)簽?2. mysql - 數(shù)據(jù)庫(kù)建字段,默認(rèn)值空和empty string有什么區(qū)別 1103. mysql - 這種分級(jí)一對(duì)多,且分級(jí)不平衡的模型該怎么設(shè)計(jì)表?4. Navicat for mysql 中以json格式儲(chǔ)存的數(shù)據(jù)存在大量反斜杠,如何去除?5. mac OSX10.12.4 (16E195)下Mysql 5.7.18找不到配置文件my.cnf6. mysql mysql_real_escape_string() 轉(zhuǎn)義問(wèn)題7. 新人求教MySQL關(guān)于判斷后拼接條件進(jìn)行查詢的sql語(yǔ)句8. mysql - 千萬(wàn)數(shù)據(jù) 分頁(yè),當(dāng)偏移量 原來(lái)越大時(shí),怎么優(yōu)化速度9. MySQL FOREIGN KEY 約束報(bào)錯(cuò)10. mysql - 數(shù)據(jù)庫(kù)表中,兩個(gè)表互為外鍵參考如何解決
