課程
/后端開(kāi)發(fā)
/Java
/細(xì)說(shuō)Java多線程之內(nèi)存可見(jiàn)性
這里為什么number的值改變了,線程A不會(huì)把主內(nèi)存的值刷新到線程A中呢?跟前面講的變量可見(jiàn)性不矛盾了嗎?
2018-08-10
源自:細(xì)說(shuō)Java多線程之內(nèi)存可見(jiàn)性 4-3
正在回答
你看看這樣能不能理解:number的值可以存在三個(gè)地方:主內(nèi)存,cpu緩存,cpu寄存器。因?yàn)榧由狭藇olatile關(guān)鍵字,cpu每次對(duì)number的讀取都強(qiáng)迫cpu緩存從主內(nèi)存中讀取。但是count++操作有三步,讀count,計(jì)算count+1,將計(jì)算的結(jié)果給count。假設(shè)讀count已經(jīng)執(zhí)行了,number已經(jīng)放到了cpu寄存器中。此時(shí)當(dāng)執(zhí)行權(quán)被其他線程搶走之后再次輪到當(dāng)前線程執(zhí)行的時(shí)候,已經(jīng)不需要再讀number了。故number還是沒(méi)有變化
慕工程4835570 提問(wèn)者
讀之前肯定是需要從主內(nèi)存中讀,但是A已經(jīng)讀取完了,就不必再去主內(nèi)存中讀
是在讀取前刷新工作內(nèi)存,從主內(nèi)存中取值,現(xiàn)在已經(jīng)讀取完了,就只操作工作內(nèi)存了
不是很好理解嘛,A第一步是先讀取number的,因?yàn)椴皇窃有?后面操作的 +1和寫(xiě)入主內(nèi)存得最新值都沒(méi)有刷到A的工作內(nèi)存中啊,別搞混了兄弟
b線程執(zhí)行之后,主內(nèi)存中number加1.假設(shè)輪到a線程執(zhí)行,此時(shí),a線程的工作內(nèi)存和執(zhí)行棧中number都是原來(lái)的值,但是它的執(zhí)行棧中已經(jīng)有該變量的值了,所以直接用了不去檢查其工作內(nèi)存中該變量的值是否需要刷新。所以用的是原來(lái)的值,這種情況存在。
可見(jiàn)性和原子性并沒(méi)有關(guān)系,volatile能保證可見(jiàn)性,卻無(wú)法保證原子性,因而線程會(huì)被干擾
舉報(bào)
用兩種方式實(shí)現(xiàn)內(nèi)存可見(jiàn)性,代領(lǐng)大家深層次學(xué)習(xí)Java中的內(nèi)存
1 回答非主線程中使用的主線程變量必須是final的
1 回答加入有5個(gè)線程,某個(gè)變量在其中三個(gè)線程中有用到。這個(gè)變量算不算共享變量呢?
4 回答ReentrantLock也能夠保證線程之間內(nèi)存的可見(jiàn)性嗎?
1 回答為什么兩個(gè)volatile變量在不變式中就會(huì)使得volatile線程不安全?
1 回答內(nèi)存可見(jiàn)性是什么意思?與共享變量可見(jiàn)性有什么關(guān)系?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢(xún)優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2018-10-22
你看看這樣能不能理解:number的值可以存在三個(gè)地方:主內(nèi)存,cpu緩存,cpu寄存器。因?yàn)榧由狭藇olatile關(guān)鍵字,cpu每次對(duì)number的讀取都強(qiáng)迫cpu緩存從主內(nèi)存中讀取。但是count++操作有三步,讀count,計(jì)算count+1,將計(jì)算的結(jié)果給count。假設(shè)讀count已經(jīng)執(zhí)行了,number已經(jīng)放到了cpu寄存器中。此時(shí)當(dāng)執(zhí)行權(quán)被其他線程搶走之后再次輪到當(dāng)前線程執(zhí)行的時(shí)候,已經(jīng)不需要再讀number了。故number還是沒(méi)有變化
2020-12-01
讀之前肯定是需要從主內(nèi)存中讀,但是A已經(jīng)讀取完了,就不必再去主內(nèi)存中讀
2019-01-22
是在讀取前刷新工作內(nèi)存,從主內(nèi)存中取值,現(xiàn)在已經(jīng)讀取完了,就只操作工作內(nèi)存了
2018-11-17
不是很好理解嘛,A第一步是先讀取number的,因?yàn)椴皇窃有?后面操作的 +1和寫(xiě)入主內(nèi)存得最新值都沒(méi)有刷到A的工作內(nèi)存中啊,別搞混了兄弟
2018-09-17
b線程執(zhí)行之后,主內(nèi)存中number加1.假設(shè)輪到a線程執(zhí)行,此時(shí),a線程的工作內(nèi)存和執(zhí)行棧中number都是原來(lái)的值,但是它的執(zhí)行棧中已經(jīng)有該變量的值了,所以直接用了不去檢查其工作內(nèi)存中該變量的值是否需要刷新。所以用的是原來(lái)的值,這種情況存在。
2018-08-25
可見(jiàn)性和原子性并沒(méi)有關(guān)系,volatile能保證可見(jiàn)性,卻無(wú)法保證原子性,因而線程會(huì)被干擾