多線程中Volatile底層實(shí)現(xiàn)原理

1.volatile的應(yīng)用

在多線程并發(fā)編程中synchronized和volatile都扮演這重要角色务豺,volatile是輕量級(jí)的synchronized退敦,他在多處理開發(fā)中保證了共享變量的“可見(jiàn)性”隆嗅〖袅猓可見(jiàn)性的意識(shí)是當(dāng)一個(gè)線程修改了一個(gè)共享變量時(shí)浪耘,另外一個(gè)線程能讀到這個(gè)修改的值症汹。如果volatile變量修飾符使用恰當(dāng)?shù)脑挶龇危萻ynchronized的使用和執(zhí)行成本更低溯饵,因?yàn)樗粫?huì)引起線程上下文的切換和調(diào)度。

2.volatile的定義和實(shí)現(xiàn)原理

java語(yǔ)言規(guī)范第3版中對(duì)volatile的定義如下:java編程語(yǔ)言允許線程訪問(wèn)共享變量锨用,為了確保共享變量能被準(zhǔn)確和一致地更新丰刊,線程應(yīng)該確保排他鎖單獨(dú)獲得這個(gè)變量。
java語(yǔ)言提供了volatile增拥,在某些情況下比鎖更加方便啄巧。如果一個(gè)字段被聲明成volatile,java線程內(nèi)存模型確保所有線程看到這個(gè)變量的值是一致的。

在了解volatile實(shí)現(xiàn)原理之前掌栅,我們先來(lái)看下與其原理相關(guān)的CPU術(shù)語(yǔ)與說(shuō)明秩仆。


圖片.png

volatile是如何保證可見(jiàn)性的呢?有volatile修飾的共享變量進(jìn)行寫操作時(shí)會(huì)多出一行匯編語(yǔ)言(lock前綴的指令)猾封,這行指令會(huì)引發(fā)兩件事情

1)將當(dāng)前處理器緩存行的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存澄耍。
2)這個(gè)寫回內(nèi)存的操作會(huì)使其在其他CPU里緩存了該內(nèi)存地址的數(shù)據(jù)無(wú)效

為了提高處理器速度,處理器不直接和內(nèi)存進(jìn)行通信晌缘,而是先將系統(tǒng)內(nèi)存的數(shù)據(jù)讀到內(nèi)部緩存(L1,L2或其他)后再進(jìn)行操作齐莲,但操作完不知道何時(shí)寫回到內(nèi)存。如果對(duì)聲明了volatile的變量進(jìn)行寫操作磷箕,JVM就會(huì)想處理器發(fā)送一條Lock前綴的指令选酗,將這個(gè)變量所在緩存行的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存。但是搀捷,就算寫回到內(nèi)存星掰,如果其他處理器緩存的值還是舊的多望,在執(zhí)行計(jì)算就會(huì)有問(wèn)題。所以氢烘,在多處理器下怀偷,為了保證各個(gè)處理器的緩存是一致的,就會(huì)實(shí)現(xiàn)緩存一致性協(xié)議播玖,每個(gè)處理里通過(guò)嗅探在總線上傳播的數(shù)據(jù)來(lái)檢查自己緩存的值是不是過(guò)期了椎工,當(dāng)處理器發(fā)現(xiàn)自己緩存行對(duì)應(yīng)的內(nèi)存地址被修改,就會(huì)將當(dāng)前處理器的緩存行設(shè)置為無(wú)效狀態(tài)蜀踏,當(dāng)處理器對(duì)這個(gè)數(shù)據(jù)進(jìn)行修改操作的時(shí)候维蒙,會(huì)重新從系統(tǒng)內(nèi)存中把數(shù)據(jù)讀到處理器緩存里。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末果覆,一起剝皮案震驚了整個(gè)濱河市颅痊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌局待,老刑警劉巖斑响,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钳榨,居然都是意外死亡舰罚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門薛耻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)营罢,“玉大人,你說(shuō)我怎么就攤上這事饼齿∷茄” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵缕溉,是天一觀的道長(zhǎng)能颁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)倒淫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任败玉,我火速辦了婚禮敌土,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘运翼。我一直安慰自己返干,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布血淌。 她就那樣靜靜地躺著矩欠,像睡著了一般财剖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上癌淮,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天躺坟,我揣著相機(jī)與錄音,去河邊找鬼乳蓄。 笑死咪橙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虚倒。 我是一名探鬼主播美侦,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼魂奥!你這毒婦竟也來(lái)了菠剩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耻煤,失蹤者是張志新(化名)和其女友劉穎具壮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體违霞,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘴办,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了买鸽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涧郊。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖眼五,靈堂內(nèi)的尸體忽然破棺而出妆艘,到底是詐尸還是另有隱情,我是刑警寧澤看幼,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布批旺,位于F島的核電站,受9級(jí)特大地震影響诵姜,放射性物質(zhì)發(fā)生泄漏汽煮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一棚唆、第九天 我趴在偏房一處隱蔽的房頂上張望暇赤。 院中可真熱鬧,春花似錦宵凌、人聲如沸鞋囊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)溜腐。三九已至译株,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挺益,已是汗流浹背歉糜。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矩肩,地道東北人现恼。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像黍檩,于是被迫代替她去往敵國(guó)和親叉袍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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