第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

這里為什么number的值改變了,線程A不會把主內(nèi)存的值刷新到線程A中呢?跟前面講的變量可見性不矛盾了嗎?

這里為什么number的值改變了,線程A不會把主內(nèi)存的值刷新到線程A中呢?跟前面講的變量可見性不矛盾了嗎?

正在回答

6 回答

你看看這樣能不能理解:number的值可以存在三個地方:主內(nèi)存,cpu緩存,cpu寄存器。因為加上了volatile關(guān)鍵字,cpu每次對number的讀取都強迫cpu緩存從主內(nèi)存中讀取。但是count++操作有三步,讀count,計算count+1,將計算的結(jié)果給count。假設(shè)讀count已經(jīng)執(zhí)行了,number已經(jīng)放到了cpu寄存器中。此時當執(zhí)行權(quán)被其他線程搶走之后再次輪到當前線程執(zhí)行的時候,已經(jīng)不需要再讀number了。故number還是沒有變化

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

慕工程4835570 提問者

就是說如果cpu緩存里已經(jīng)讀取了number的值,則不在重新讀了。volatile強迫cpu對number讀值只是在cpu緩存中還沒有值的時候?
2019-01-17 回復(fù) 有任何疑惑可以回復(fù)我~

讀之前肯定是需要從主內(nèi)存中讀,但是A已經(jīng)讀取完了,就不必再去主內(nèi)存中讀

0 回復(fù) 有任何疑惑可以回復(fù)我~

是在讀取前刷新工作內(nèi)存,從主內(nèi)存中取值,現(xiàn)在已經(jīng)讀取完了,就只操作工作內(nèi)存了

0 回復(fù) 有任何疑惑可以回復(fù)我~

不是很好理解嘛,A第一步是先讀取number的,因為不是原子性,后面操作的 +1和寫入主內(nèi)存得最新值都沒有刷到A的工作內(nèi)存中啊,別搞混了兄弟

0 回復(fù) 有任何疑惑可以回復(fù)我~

b線程執(zhí)行之后,主內(nèi)存中number加1.假設(shè)輪到a線程執(zhí)行,此時,a線程的工作內(nèi)存和執(zhí)行棧中number都是原來的值,但是它的執(zhí)行棧中已經(jīng)有該變量的值了,所以直接用了不去檢查其工作內(nèi)存中該變量的值是否需要刷新。所以用的是原來的值,這種情況存在。

0 回復(fù) 有任何疑惑可以回復(fù)我~

可見性和原子性并沒有關(guān)系,volatile能保證可見性,卻無法保證原子性,因而線程會被干擾

0 回復(fù) 有任何疑惑可以回復(fù)我~

舉報

0/150
提交
取消

這里為什么number的值改變了,線程A不會把主內(nèi)存的值刷新到線程A中呢?跟前面講的變量可見性不矛盾了嗎?

我要回答 關(guān)注問題
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號