(十四)內(nèi)存屏障

重排

內(nèi)存屏障

內(nèi)存屏障種類(lèi)

編譯器和處理器必須同時(shí)遵守重排規(guī)則炬藤。多核處理器需使用內(nèi)存屏障指令來(lái)確保一致性虽界。即使編譯器優(yōu)化掉了一個(gè)字段訪問(wèn)(因?yàn)橐粋€(gè)讀入的值未被使用)摄乒,需要產(chǎn)生內(nèi)存屏障歹袁,就像這個(gè)訪問(wèn)仍然需要保護(hù)枷餐。(可參考下面的優(yōu)化掉內(nèi)存屏障的章節(jié))靶瘸。

內(nèi)存屏障指令僅直接控制CPU與其緩存之間,與垃圾回收機(jī)制中“寫(xiě)屏障(write barriers)”無(wú)關(guān)毛肋。

一怨咪、重排序

編譯器或者CPU的代碼的結(jié)構(gòu)重排排序,達(dá)到最佳效果润匙。

(1)編譯器重排

CPU只讀一次的x和y值诗眨。不需反復(fù)讀取寄存器來(lái)交替x和y值

(2)處理器重排

寫(xiě)緩存區(qū)沒(méi)有及時(shí)刷新孕讳,使得處理器執(zhí)行的讀寫(xiě)操作與內(nèi)存上順序不一致匠楚。

處理器A讀b=0,處理器B讀a=0厂财。A1寫(xiě)a=1先寫(xiě)到處理器A的寫(xiě)緩存區(qū)中芋簿,此時(shí)內(nèi)存中a=0。如果這時(shí)處理器B從內(nèi)存中讀a璃饱,讀到的將是0与斤。

可能會(huì)出現(xiàn)x,y都是0。

二、內(nèi)存屏障

為了解決上述問(wèn)題撩穿,處理器提供內(nèi)存屏障指令(Memory Barrier):

寫(xiě)內(nèi)存屏障(Store Memory Barrier):處理器將存儲(chǔ)緩存值寫(xiě)回主存(阻塞方式)磷支。

讀內(nèi)存屏障(Load Memory Barrier):處理器,處理失效隊(duì)列(阻塞方式)食寡。

保證兩個(gè)操作之間數(shù)據(jù)的可見(jiàn)性雾狈。

volatile讀前插讀屏障,寫(xiě)后加寫(xiě)屏障冻河,避免CPU重排導(dǎo)致的問(wèn)題箍邮,實(shí)現(xiàn)多線程之間數(shù)據(jù)的可見(jiàn)性

三叨叙、內(nèi)存屏障的種類(lèi)

StoreLoad開(kāi)銷(xiāo)最大锭弊。萬(wàn)能屏障,兼具其它三種內(nèi)存屏障功能擂错。執(zhí)行時(shí)味滞,處理器通常要把寫(xiě)緩沖區(qū)中的數(shù)據(jù)全部刷新的內(nèi)存中

對(duì)于處理器來(lái)說(shuō),內(nèi)存屏障會(huì)導(dǎo)致cpu緩存的刷新钮呀,刷新時(shí)剑鞍,會(huì)遵循緩存一致性協(xié)議。

lock解鎖時(shí)爽醋,jvm會(huì)強(qiáng)制刷新cpu緩存蚁署,導(dǎo)致當(dāng)前線程更改,對(duì)其他線程可見(jiàn)蚂四。

volatile:標(biāo)記volatile的字段光戈,在寫(xiě)操作時(shí),會(huì)強(qiáng)制刷新cpu緩存遂赠,標(biāo)記volatile的字段久妆,每次讀取都是直接讀內(nèi)存

final:即時(shí)編譯器在final寫(xiě)操作后跷睦,會(huì)插入內(nèi)存屏障筷弦,來(lái)禁止重排序,保證可見(jiàn)性

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抑诸,一起剝皮案震驚了整個(gè)濱河市烂琴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哼鬓,老刑警劉巖监右,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異异希,居然都是意外死亡健盒,警方通過(guò)查閱死者的電腦和手機(jī)绒瘦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扣癣,“玉大人惰帽,你說(shuō)我怎么就攤上這事「嘎牵” “怎么了该酗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)士嚎。 經(jīng)常有香客問(wèn)我呜魄,道長(zhǎng),這世上最難降的妖魔是什么莱衩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任爵嗅,我火速辦了婚禮,結(jié)果婚禮上笨蚁,老公的妹妹穿的比我還像新娘睹晒。我一直安慰自己,他們只是感情好括细,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布伪很。 她就那樣靜靜地躺著,像睡著了一般奋单。 火紅的嫁衣襯著肌膚如雪锉试。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天览濒,我揣著相機(jī)與錄音键痛,去河邊找鬼。 笑死匾七,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的江兢。 我是一名探鬼主播昨忆,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杉允!你這毒婦竟也來(lái)了邑贴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叔磷,失蹤者是張志新(化名)和其女友劉穎拢驾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體改基,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡繁疤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稠腊。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躁染,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出架忌,到底是詐尸還是另有隱情吞彤,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布叹放,位于F島的核電站饰恕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏井仰。R本人自食惡果不足惜埋嵌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望糕档。 院中可真熱鬧莉恼,春花似錦、人聲如沸速那。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)端仰。三九已至捶惜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荔烧,已是汗流浹背吱七。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹤竭,地道東北人踊餐。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像臀稚,于是被迫代替她去往敵國(guó)和親吝岭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 內(nèi)存屏障是硬件之上吧寺、操作系統(tǒng)或JVM之下窜管,對(duì)并發(fā)作出的最后一層支持。再向下是是硬件提供的支持稚机;向上是操作系統(tǒng)或JV...
    猴子007閱讀 39,661評(píng)論 10 72
  • Java內(nèi)存區(qū)域 Java虛擬機(jī)在運(yùn)行程序時(shí)會(huì)把其自動(dòng)管理的內(nèi)存劃分為以上幾個(gè)區(qū)域幕帆,每個(gè)區(qū)域都有的用途以及創(chuàng)建銷(xiāo)毀...
    架構(gòu)師springboot閱讀 1,766評(píng)論 0 5
  • 我們一起來(lái)討論討論java內(nèi)存模型。理解內(nèi)存模型對(duì)多線程編程無(wú)疑是有好處的赖条。 java代碼是如何跑起來(lái)的 java...
    caixiangwang閱讀 572評(píng)論 0 3
  • 以上代碼會(huì)重復(fù)運(yùn)行 失乾, 不會(huì)停止常熙。 JMM(java內(nèi)存模型) 若想學(xué)習(xí)好多線程, 那么必須了解一下JMM Jav...
    尼爾君閱讀 1,747評(píng)論 0 2
  • 目錄: 1. 指令重排 2. 順序一致性 3. volatile 4. final 1.指令重排 要了解指令重排仗扬,...
    西部小籠包閱讀 744評(píng)論 0 1