Java volatile 理解

1. 現(xiàn)代CPU Cache結構

多核 CPU Cache 結構
1.1 緩存的主要作用

現(xiàn)代多核CPU為了提升處理速度肛响,都會將需要的數(shù)據(jù)從內(nèi)存拷貝到各自的緩存中(L1岭粤,L2),然后在各自的緩存中對數(shù)據(jù)進行操作终惑。

1.2 緩存的作用范圍

L1,L2 是CPU中每個核私有的门扇,用于備份各自所需要的數(shù)據(jù)雹有。L3 Cache是CPU每個核共享的偿渡。

1.3 緩存的寫入模式

寫回(write-back)模式:各個核每次修改自己緩存中的數(shù)據(jù)后不會立即寫回到內(nèi)存,而是等到一定合適的時間才寫回到內(nèi)存霸奕。
直寫(write-through)模式:各個核每次修改自己緩存中的數(shù)據(jù)后會立即寫回到內(nèi)存溜宽。

1.4 緩存的一致性

無論哪種寫入模式,試想质帅,如果多個核都從內(nèi)存緩存了一份相同的數(shù)據(jù)适揉,而此時有一個核將自己緩存中的數(shù)據(jù)進行了修改,其他核緩存中的數(shù)據(jù)卻依然是修改之前的數(shù)據(jù)煤惩,這就造成了各個核之間緩存數(shù)據(jù)的不一致嫉嘀,而我們所期望的是各個核緩存之間的數(shù)據(jù)可以同步,為了達到同步的目的魄揉,各個核的緩存需要共同遵守一份協(xié)議剪侮,保證修改共享數(shù)據(jù)的時候可以通知其他緩存,這就是CPU的緩存一致性協(xié)議洛退。

緩存一致性協(xié)議有多種瓣俯,但是基本上都是基于MESI協(xié)議進行擴展的,詳細的內(nèi)容可以查閱相關文檔了解兵怯。

2. volatile的實現(xiàn)原理

2.1 可見性

可見性彩匕,即一個線程修改一個共享變量時,其他線程可以獲取到修改后的值媒区。JVM的實現(xiàn)中驼仪,volatile共享變量的寫操作會向處理器發(fā)送一條Lock指令,聲言使用直寫模式驻仅,在CPU緩存一致性協(xié)議的保證下實現(xiàn)volitile共享變量的可見性谅畅。

簡單來講,多核環(huán)境下噪服,對volatile共享變量進行寫操作會將緩存的結果直接寫回到內(nèi)存中毡泻,在緩存一致性協(xié)議下,其他核會對總線上傳輸?shù)臄?shù)據(jù)一直進行窺探粘优,即監(jiān)測其他核對緩存數(shù)據(jù)的操作仇味。因此,volatile共享變量寫回內(nèi)存的操作會被其他核監(jiān)測到雹顺,此時這些核會將自己緩存中的數(shù)據(jù)設為無效狀態(tài)丹墨,當需要對這個數(shù)據(jù)進行修改操作的時候會重新從內(nèi)存中讀取,這樣就達到了volatile修飾變量的可見性嬉愧。

2.1 原子性

volatile修飾的變量無論是讀還是寫操作贩挣,都是具備原子性的,可以理解為使用了鎖:

volatile int value = 1;
public void set(int value) {
   this.value = value;
}
public void get() {
   return this.value;
}
int value = 1;
public synchronized void set(int value) {
   this.value = value;
}
public synchronized int get() {
   return this.value;
}

這意味著多線程環(huán)境下任何一個線程讀取到的volatile修飾的共享變量都是當前的最新值,不會存在差異性王财。
但是有一點需要注意卵迂,volatile只是保證了讀/寫的原子性,復合的volatile操作并不保證原子性绒净,例如:

volatile int value = 1
public void set(int value) {
   this.value = value++;
}

因為value++這個操作可以分為三個步驟见咒,首先,讀取value的值挂疆,其次改览,
進行自增操作,最后缤言,將結果寫入內(nèi)存宝当。需要知道這三個操作volatile并不能保證原子性,即只能保證讀取到的value是最新值墨闲,如果此時該處理器讀取value之后由于某些原因阻塞今妄,而此時其他處理器剛好對value進行了修改,這個時候之前的處理器進行計算時還是使用之前讀取到的value鸳碧,這樣就造成了錯誤的處理結果盾鳞。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瞻离,隨后出現(xiàn)的幾起案子腾仅,更是在濱河造成了極大的恐慌,老刑警劉巖套利,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件推励,死亡現(xiàn)場離奇詭異,居然都是意外死亡肉迫,警方通過查閱死者的電腦和手機验辞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喊衫,“玉大人跌造,你說我怎么就攤上這事∽骞海” “怎么了壳贪?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寝杖。 經(jīng)常有香客問我违施,道長,這世上最難降的妖魔是什么瑟幕? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任磕蒲,我火速辦了婚禮留潦,結果婚禮上,老公的妹妹穿的比我還像新娘辣往。我一直安慰自己愤兵,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布排吴。 她就那樣靜靜地躺著,像睡著了一般懦鼠。 火紅的嫁衣襯著肌膚如雪钻哩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天肛冶,我揣著相機與錄音街氢,去河邊找鬼。 笑死睦袖,一個胖子當著我的面吹牛珊肃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馅笙,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伦乔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了董习?” 一聲冷哼從身側(cè)響起烈和,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎皿淋,沒想到半個月后招刹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡窝趣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年疯暑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哑舒。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡妇拯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出散址,到底是詐尸還是另有隱情乖阵,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布预麸,位于F島的核電站瞪浸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吏祸。R本人自食惡果不足惜对蒲,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一钩蚊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹈矮,春花似錦砰逻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至北滥,卻和暖如春刚操,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背再芋。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工菊霜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人济赎。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓鉴逞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親司训。 傳聞我的和親對象是個殘疾皇子构捡,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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

  • 從三月份找實習到現(xiàn)在,面了一些公司壳猜,掛了不少叭喜,但最終還是拿到小米、百度蓖谢、阿里捂蕴、京東、新浪闪幽、CVTE啥辨、樂視家的研發(fā)崗...
    時芥藍閱讀 42,247評論 11 349
  • 擦肩而過,沒有遇上博子的藤井盯腌,回家看到信溉知,匆匆寫了一封回信,講述了自己曾有一個高中時代的同班男生腕够,和她同名同姓级乍。博...
    魚耗子閱讀 177評論 0 0
  • 前言 好了,一個大齡老男人的悲情回憶環(huán)節(jié)結束帚湘,下面開始正題玫荣。 個人認為想要在安卓開發(fā)的道路上走的很長遠,J2SE的...
    尼古拉斯_富貴閱讀 131評論 0 0