java線程同步之volatile

volatile的概念:

volatile與synchronized關(guān)鍵字是多線程并發(fā)編程中非常重要的知識點夕凝,通常被用于修飾變量晰韵。相比于synchroinized來說蔽介,volatile要輕量很多伐蒋,執(zhí)行的成本會更低灾票。原因是volatile不會引起線程上下文的切換和調(diào)度咽瓷,但是它與synchronized的意義其實是有區(qū)別的苟径。synchronized關(guān)鍵字主要體現(xiàn)的是互斥性贡避,而volatile體現(xiàn)的便是可見性战转、原子性搜立。從根本上來說,volatile用于多線程之間內(nèi)存的共享槐秧。

volatile使用意義:

Java內(nèi)存模型:

從下面圖中可以看出啄踊,java的內(nèi)存模型定義了主內(nèi)存本地內(nèi)存,這是一種抽象的概念刁标。主內(nèi)存是所有線程可以共享的區(qū)域颠通,本地內(nèi)存為線程私有化。為了提高性能膀懈,線程通常不直接從主內(nèi)存中讀出和寫入內(nèi)容顿锰,而是通過本地內(nèi)存,并通過一定的刷新機制進行內(nèi)容同步启搂。本文主要介紹volatile相關(guān)知識硼控,關(guān)于java內(nèi)存模型內(nèi)容在后面專題分析。以下分別為不使用volatile和使用volatile關(guān)鍵字的區(qū)別:

不使用volatile關(guān)鍵字
使用volatile關(guān)鍵字
volatile意義:

上圖看出胳赌,當線程A與線程B訪問同一個變量a時牢撼,若在線程A中將a的值從0修改為1,線程B中讀取變量a的值疑苫,依然是0熏版。而使用volatile關(guān)鍵字之后情況就不一樣,線程B讀取到a的值為1捍掺。原因在與撼短,沒有使用volatile關(guān)鍵字修飾變量時,線程A的修改只是在本地內(nèi)存A中挺勿,不會同步到主內(nèi)存阔加,線程B也只是從本地內(nèi)存B中讀取,因此無法實現(xiàn)修改同步满钟。使用volatile關(guān)鍵字之后胜榔,在線程A中修改了a的值,會將修改從本地內(nèi)存A寫入到主內(nèi)存中湃番,而當線程B讀取a的值時夭织,會直接從主內(nèi)存中讀取,并刷新本地內(nèi)存B吠撮。因此尊惰,線程A與線程B便能夠?qū)崿F(xiàn)內(nèi)存之間的共享了,實現(xiàn)內(nèi)存的可見性泥兰。

volatile實現(xiàn)原理:

被修飾變量值修改時處理器會將緩存行數(shù)據(jù)寫入到主內(nèi)存中

如果變量被聲明為volatile弄屡,當進行寫操作時,JVM會向處理器發(fā)送一條Lock前綴的指令鞋诗,然后將變量在緩存中所修改的值寫入到系統(tǒng)內(nèi)存中膀捷。

緩存一致性協(xié)議

如果volatile僅僅只有將緩存數(shù)據(jù)寫入到系統(tǒng)主存的能力,并不能實現(xiàn)線程之間的共享削彬。當有多個處理器存在的情況下全庸,為了保證各個處理器緩存內(nèi)容的一致性,處理器會實現(xiàn)緩存一致性協(xié)議融痛。每個處理器通過嗅探在總線上傳播的數(shù)據(jù)壶笼,檢查自己緩存的值是不是過期,當處理器發(fā)現(xiàn)自己緩存中所對應變量的內(nèi)存地址被修改時雁刷,就會將當前緩存行標志成無效狀態(tài)覆劈,當處理器需要讀取或是修改數(shù)據(jù)時,會直接從主內(nèi)存中加載數(shù)據(jù)到緩存中沛励,保證數(shù)據(jù)的一致性责语。

結(jié)束語

本篇只是概括性介紹volatile的一些基礎知識,對于原理的分析比較簡單易懂侯勉。如果要深入了解可以讀以下《java并發(fā)編程的藝術(shù)》一書鹦筹,書中有比較詳細的知識,或是參考這篇文章 正確使用 Volatile 變量

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末址貌,一起剝皮案震驚了整個濱河市铐拐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌练对,老刑警劉巖遍蟋,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異螟凭,居然都是意外死亡虚青,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門螺男,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棒厘,“玉大人纵穿,你說我怎么就攤上這事∩萑耍” “怎么了谓媒?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長何乎。 經(jīng)常有香客問我句惯,道長,這世上最難降的妖魔是什么支救? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任抢野,我火速辦了婚禮,結(jié)果婚禮上各墨,老公的妹妹穿的比我還像新娘指孤。我一直安慰自己,他們只是感情好欲主,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布邓厕。 她就那樣靜靜地躺著,像睡著了一般扁瓢。 火紅的嫁衣襯著肌膚如雪详恼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天引几,我揣著相機與錄音昧互,去河邊找鬼。 笑死伟桅,一個胖子當著我的面吹牛敞掘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楣铁,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼玖雁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盖腕?” 一聲冷哼從身側(cè)響起赫冬,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溃列,沒想到半個月后劲厌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡听隐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年补鼻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡风范,死狀恐怖咨跌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硼婿,我是刑警寧澤虑润,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站加酵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哭当。R本人自食惡果不足惜猪腕,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钦勘。 院中可真熱鬧陋葡,春花似錦、人聲如沸彻采。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肛响。三九已至岭粤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間特笋,已是汗流浹背剃浇。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猎物,地道東北人虎囚。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蔫磨,于是被迫代替她去往敵國和親淘讥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

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

  • 從三月份找實習到現(xiàn)在堤如,面了一些公司蒲列,掛了不少,但最終還是拿到小米煤惩、百度嫉嘀、阿里、京東魄揉、新浪剪侮、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,243評論 11 349
  • 本文基于周志明的《深入理解java虛擬機 JVM高級特性與最佳實踐》所寫。特此推薦瓣俯。 衡量一個服務性能的高低好壞杰标,...
    陽光的技術(shù)小棧閱讀 1,077評論 0 3
  • 瀟瀟未然 最近看了本書,說的是堅持彩匕。比如自己喜歡的事情堅持下去必定有好多收獲腔剂。借之反思了自己,覺得自己一路上成...
    瀟瀟未然閱讀 123評論 0 0
  • 介紹 這篇主要講述設計模式中的組合模式驼仪。組合模式又叫部分整體模式掸犬,是用于把一組相似的對象當作一個單一的對象。組合模...
    東西的南北閱讀 336評論 0 1
  • 要多少次回眸绪爸, 才恰好對上你的眼湾碎。 那深深的深深的 墨綠色的夜空, 我在千百次尋找 一點星光奠货。 把你藏進夢中介褥, 藍...
    白宿灬閱讀 193評論 0 0