Java Concurrent volatile

基礎(chǔ)概念

volatile 是一個Java 中的關(guān)鍵字,一個提供基礎(chǔ)同步屬性的關(guān)鍵字。針對JVM重排序在并發(fā)場景下的問題,被vlolatile修飾的關(guān)鍵詞摘能,編譯器不會將該變量的操作與其他內(nèi)存操作進行重排序。

1敲街、重排序:如果熟悉JVM的話团搞,應(yīng)該就很清楚Java的重排序了。重排序主要分為:編譯器優(yōu)化的重排序聪富、指令級別并行的重排序莺丑、內(nèi)存系統(tǒng)的重排序。其中編譯器重排序:在不改變代碼語義的情況下墩蔓,優(yōu)化性能而改變了代碼執(zhí)行順序梢莽。指令并行的重排序:處理器采用并行技術(shù)使多條指令重疊執(zhí)行,在不存在數(shù)據(jù)依賴的情況下奸披,改變機器指令的執(zhí)行順序昏名。內(nèi)存系統(tǒng)的重排序:使用緩存和讀寫緩沖區(qū)時,加載和存儲可能是亂序執(zhí)行阵面。
2轻局、JMM:java 內(nèi)存模型(一種語言級別的內(nèi)存模型),Java內(nèi)存模型分為一個工作線程样刷、線程私有的工作內(nèi)存仑扑、共享的主存。

image.png

3置鼻、as-if-serial:無論怎么排镇饮,要保證和串行執(zhí)行的結(jié)果一致。對于單線程來說箕母,對存在依賴關(guān)系的操作進行重排序储藐,不會改變最后的執(zhí)行結(jié)果俱济,在多線程程序中,對存在依賴關(guān)系的操作進行重排序钙勃,可能會改變最后的執(zhí)行結(jié)果蛛碌。就需要我們自己來保證as-if-serial了。
4辖源、hanpens-before:指前一個操作對后一個操作可見蔚携。(注意一點:不是前一個操作必須在后一個操作之前執(zhí)行,不是串行執(zhí)行)
看完這三個前提克饶,就可以去理解volatile了浮梢,

volatile原理

volatile更像是語言層面,對于JVM執(zhí)行過程中對于重排序的限制彤路,是一種內(nèi)存屏障,這個屏障就像是一堵墻芥映,阻止了前后的重排序操作(具體屏障:LoadLoad屏障和LoadStore屏障)


image.png

StoreStore洲尊、StoreLoad


image.png

volatile 保證了一種可見性,什么意思呢奈偏,就是說volatile修飾的變量坞嘀,產(chǎn)生變化時,立馬寫入主存惊来。保證其他線程能發(fā)現(xiàn)其變化丽涩,保證了正確性,也就是happens-before裁蚁。

常見問題

1矢渊、volatile不是鎖,僅僅是一種程序執(zhí)行過程中的指令級的同步策略枉证,保證了可見性矮男、避免重排序
2、volatile能夠維持被修飾變量單個的原子操作室谚。所以說毡鉴,對于volatile double 進行單個寫操作在多線程并發(fā)環(huán)境下是完全正常的。這里注意一點秒赤,一定是單個操作猪瞬,像是i++; i--入篮;之類的這明顯是復(fù)合操作哈陈瘦,別較真當作單個操作。

使用場景

1崎弃、保證long甘晤、double等的單個操作的原子性含潘,不至于寫完一半被讀走。
2线婚、作為基礎(chǔ)信號量遏弱,發(fā)生變化時,能夠其他線程周知塞弊,但記住一點復(fù)合操作可不保證原子性漱逸,讀后寫什么的在多線程并發(fā)環(huán)境下還是進行同步操作吧。
volatile 差不多就這些游沿,真正的使用體驗可以嘗試自己寫demo饰抒,比如說通過信號量改變打斷死循環(huán),多線程瘋狂i++操作等诀黍〈樱看concurrent包中的源碼時,volatile是必須要理解的眯勾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枣宫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吃环,更是在濱河造成了極大的恐慌也颤,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郁轻,死亡現(xiàn)場離奇詭異翅娶,居然都是意外死亡,警方通過查閱死者的電腦和手機好唯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門竭沫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渠啊,你說我怎么就攤上這事输吏。” “怎么了替蛉?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵贯溅,是天一觀的道長。 經(jīng)常有香客問我躲查,道長它浅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任镣煮,我火速辦了婚禮姐霍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己镊折,他們只是感情好胯府,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恨胚,像睡著了一般骂因。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赃泡,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天寒波,我揣著相機與錄音,去河邊找鬼升熊。 笑死俄烁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的级野。 我是一名探鬼主播页屠,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蓖柔!你這毒婦竟也來了卷中?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤渊抽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后议忽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懒闷,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年栈幸,在試婚紗的時候發(fā)現(xiàn)自己被綠了愤估。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡速址,死狀恐怖玩焰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芍锚,我是刑警寧澤昔园,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站并炮,受9級特大地震影響默刚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逃魄,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一荤西、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦邪锌、人聲如沸勉躺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饵溅。三九已至,卻和暖如春舶胀,著一層夾襖步出監(jiān)牢的瞬間概说,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工嚣伐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糖赔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓轩端,卻偏偏與公主長得像放典,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子基茵,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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