內(nèi)存屏障

Java內(nèi)存模型與硬件內(nèi)存架構(gòu)的關(guān)系

多線程的指向最終都映射在硬件處理器上進(jìn)行執(zhí)行画髓,但是Java內(nèi)存模型與硬件內(nèi)存架構(gòu)并不完全一致徘郭,對(duì)于硬件內(nèi)存來說之后寄存器端朵、緩存內(nèi)存液肌、主內(nèi)存概念之分,并沒有工作內(nèi)存焰络、主內(nèi)存之分戴甩,也就是說Java內(nèi)存模型對(duì)內(nèi)存的劃分對(duì)硬件內(nèi)存并沒有任何影響,因?yàn)镴MM只是一種抽象的概念闪彼,是一種規(guī)則甜孤,并不實(shí)際存在,這個(gè)規(guī)范存在的意義是定義了程序各個(gè)變量的訪問方式畏腕,屏蔽掉各種硬件和操作系統(tǒng)的內(nèi)存訪問差異缴川,以實(shí)現(xiàn)讓java程序在各種平臺(tái)下都能達(dá)到一致的并發(fā)效果。不管是工作內(nèi)存還是主內(nèi)存的數(shù)據(jù)描馅,對(duì)于計(jì)算機(jī)硬件來說都會(huì)存儲(chǔ)在計(jì)算機(jī)主內(nèi)存中把夸,當(dāng)然有可能存儲(chǔ)袋CPU緩存或者寄存器中,因此Java內(nèi)存模型和計(jì)算機(jī)硬件內(nèi)存架構(gòu)是一種相互交叉的關(guān)系铭污,是一種抽象概念劃分與真實(shí)物理硬件的交叉

在這里插入圖片描述

重排序

as-if-serial語義
不管怎么重排序恋日,程序的執(zhí)行結(jié)果不能被改變,編譯器嘹狞、runtime和處理器都必須遵守as-if-serial語義岂膳。編譯器和處理器不會(huì)對(duì)存在數(shù)據(jù)依賴關(guān)系的操作做重排序,因?yàn)檫@種重排序會(huì)改變執(zhí)行結(jié)果磅网,但是闷营,如果操作之間不存在數(shù)據(jù)依賴關(guān)系,這些操作就可能被編譯器和處理器做重排序知市。

重排序種類

  • 編譯器優(yōu)化的重排序;
  • 指令級(jí)并行的重排序速蕊;
  • 內(nèi)存系統(tǒng)的重排序嫂丙;

如何禁止重排序
對(duì)于編譯器,JMM編譯器重排序規(guī)則會(huì)禁止特定類型的編譯器重排序规哲;
對(duì)于處理器跟啤,JMM的處理器重排序規(guī)則會(huì)要求Java編譯器在生成指令序列時(shí),插入特定類型的內(nèi)存屏障指令,通過內(nèi)存屏障指令來禁止特定類型的處理器重排序隅肥。

內(nèi)存屏障

為什么會(huì)有內(nèi)存屏障竿奏?

  • 每個(gè)CPU都會(huì)有自己的緩存(有的甚至有三級(jí)緩存),緩存的目的就是為了提高性能腥放,避免每次都要向內(nèi)存取泛啸,但是這樣的弊端也是很明顯:不能實(shí)時(shí)和內(nèi)存發(fā)生信息交換,分在不同CPU執(zhí)行的不同線程對(duì)同一變量的緩存值不同秃症。
  • 用Volatile關(guān)鍵字修飾變量可以解決上述問題候址,Volatile通過內(nèi)存屏障來實(shí)現(xiàn),內(nèi)存屏障是硬件層的概念种柑,不同的硬件平臺(tái)實(shí)現(xiàn)內(nèi)存屏障的手段并不是一樣的岗仑,java通過屏蔽這些差異,統(tǒng)一由jvm來生成內(nèi)存屏障指令聚请。

作用

  1. 確保指令重排序時(shí)不會(huì)把屏障后面的指令排到內(nèi)存屏障之前的位置荠雕,也不會(huì)把前面的指令排到內(nèi)存屏障后面。
  2. 強(qiáng)制把寫緩沖區(qū)/高速緩存中的數(shù)據(jù)等寫回主內(nèi)存驶赏,讓緩存中相應(yīng)的數(shù)據(jù)失效炸卑;

Load Barrier 讀屏障
在指令前插入Load Barrier,可以讓高速緩存中的數(shù)據(jù)失效母市,強(qiáng)制重新從主內(nèi)存加載數(shù)據(jù)矾兜;

Store Barrier 寫屏障
利用緩存一致性機(jī)制強(qiáng)制將對(duì)緩存的修改操作立即寫入主存,讓其他線程可見患久,并且緩存一致性機(jī)制會(huì)阻止同時(shí)修改由兩個(gè)以上CPU緩存的內(nèi)存區(qū)域數(shù)據(jù)椅寺。

內(nèi)存屏障類型

為了保證可見性,Java編譯器在生成指令序列的適當(dāng)位置會(huì)插入內(nèi)存屏障指令來禁止特定類型的處理器重排序蒋失。


在這里插入圖片描述

其中StoreLoad指令是現(xiàn)代多處理器都需要使用的返帕,但是它的開銷也很昂貴。

volatile插入屏障策略

  • 在每個(gè)volatile寫操作的前面插入一個(gè)StoreStore屏障篙挽;
  • 在每個(gè)volatile寫操作的后面插入StoreLoad屏障荆萤;
  • 在每個(gè)volatile讀操作的后面插入LoadLoad屏障;
  • 在每個(gè)volatile讀操作的后面插入LoadStore屏障铣卡;

實(shí)現(xiàn)原理
Volatile變量 寫匯編指令會(huì)多出#Lock前綴链韭,Lock前綴在多核處理器下的作用:

  • 將當(dāng)前處理器緩存行的數(shù)據(jù)寫會(huì)主存啄踊;
  • 令其他CPU里緩存該內(nèi)存地址的數(shù)據(jù)失效倔喂;(總線鎖定雾家?MESI緩存一致性協(xié)議)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末站宗,一起剝皮案震驚了整個(gè)濱河市刘陶,隨后出現(xiàn)的幾起案子惠遏,更是在濱河造成了極大的恐慌序厉,老刑警劉巖冒滩,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沉迹,居然都是意外死亡睦疫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門鞭呕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛤育,“玉大人,你說我怎么就攤上這事琅拌∮б粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵进宝,是天一觀的道長刻坊。 經(jīng)常有香客問我,道長党晋,這世上最難降的妖魔是什么谭胚? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮未玻,結(jié)果婚禮上灾而,老公的妹妹穿的比我還像新娘。我一直安慰自己扳剿,他們只是感情好旁趟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庇绽,像睡著了一般锡搜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞧掺,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天耕餐,我揣著相機(jī)與錄音,去河邊找鬼辟狈。 笑死肠缔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哼转。 我是一名探鬼主播明未,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼壹蔓!你這毒婦竟也來了亚隅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤庶溶,失蹤者是張志新(化名)和其女友劉穎煮纵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偏螺,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡行疏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了套像。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酿联。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖夺巩,靈堂內(nèi)的尸體忽然破棺而出贞让,到底是詐尸還是另有隱情,我是刑警寧澤柳譬,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布喳张,位于F島的核電站,受9級(jí)特大地震影響美澳,放射性物質(zhì)發(fā)生泄漏销部。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一制跟、第九天 我趴在偏房一處隱蔽的房頂上張望舅桩。 院中可真熱鬧,春花似錦雨膨、人聲如沸擂涛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撒妈。三九已至,卻和暖如春甥雕,著一層夾襖步出監(jiān)牢的瞬間踩身,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工社露, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挟阻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓峭弟,卻偏偏與公主長得像附鸽,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞒瘸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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