[Java并發(fā)系列] 1.Java并發(fā)機制的底層實現(xiàn)

在Java并發(fā)實現(xiàn)的機制中剃诅,大部分的容器和框架都是依賴于volatile/synchronized/原子操作實現(xiàn)的伙狐,了解底層的并發(fā)機制,對于并發(fā)編程會帶來很多幫助

1. synchronized的應(yīng)用

synchronized在多線程并發(fā)編程中已經(jīng)是一個元老級的存在带饱,通常被稱作是重量級鎖邻奠。既然是常用的一種鎖,那么就需要對它的底層實現(xiàn)有深入的了解辜妓。

1. synchronized的實現(xiàn)原理

當一個線程在訪問同步代碼塊時枯途,就必須要先獲取該代碼塊中對象的鎖,退出或者拋出異常時籍滴,就必須要釋放鎖酪夷。synchronized的同步實現(xiàn),是JVM基于進入和退出同步對象的Monitor對象來實現(xiàn)方法同步和代碼塊同步的孽惰。
每個Monitor對象都有與之關(guān)聯(lián)的monitor晚岭,當且僅當monitor被持有后,它才會處于鎖定狀態(tài)勋功。同步代碼是使用monitorenter和monitorexit指令實現(xiàn)的坦报。monitorenter指令時在代碼編譯后插入到同步代碼塊的開始位置,monitorexit指令則是插入到方法的結(jié)束和異常處狂鞋。當線程執(zhí)行到monitorenter時片择,會嘗試去獲取對象的monitor的所有權(quán),即嘗試獲取對象的鎖骚揍。

2. synchronized的使用形式及意義
  • 修飾普通方法:鎖是當前實例對象
  • 修飾靜態(tài)方法:鎖是當前類的Class對象
  • 修飾代碼塊:鎖是synchronized括號里面配置的對象
3. 鎖的升級

鎖共有四種狀態(tài):無鎖狀態(tài)->偏向鎖狀態(tài)->輕量級鎖狀態(tài)->重量級鎖狀態(tài)

偏向鎖:當線程訪問同步塊并獲取鎖時字管,會在對象頭和棧針中的鎖記錄中存儲鎖偏向的ID,以后該線程在進入和退出同步塊時就不需要在使用CAS操作來進行加鎖和解鎖操作信不,而僅僅需要測試一下對象頭中的Mark Word字段中存儲的線程ID是否是當前線程即可嘲叔。如果是,那么表示獲取鎖成功抽活;如果不是硫戈,則需要檢查對象頭中偏向鎖的字段是否設(shè)置為了1(表示當前鎖是偏向鎖),如果沒有設(shè)置酌壕,則需要使用CAS來競爭獲取鎖掏愁,如果已經(jīng)設(shè)置了,則嘗試使用CAS將對象頭的偏向鎖ID指向當前線程卵牍。
輕量級鎖果港;

  • 輕量級鎖加鎖:線程在執(zhí)行同步塊之前,首先會在自己的線程棧中創(chuàng)建一個用于存儲鎖記錄的空間糊昙,并將對象中的Mark Word 賦值到鎖記錄中辛掠。然后線程嘗試使用CAS操作將對象頭中的Mark Word替換為指向鎖記錄的指針。如果成功,則表示當前線程獲取鎖萝衩,如果失敗回挽,則表示其他線程也在競爭鎖,當前線程便使用自循的方式來獲取鎖猩谊。
  • 輕量級鎖解鎖:輕量級鎖解鎖時千劈,會使用原子CAS操作將鎖記錄替換會對象頭,如果成功牌捷,則表示沒有競爭發(fā)生墙牌。如果失敗,則表示當前鎖存在競爭暗甥,鎖就會膨脹為重量級鎖喜滨。
4. 鎖的對比
鎖類型 優(yōu)點 缺點
重量級鎖 線程競爭不使用自旋,不會浪費CPU 線程阻塞撤防,響應(yīng)時間慢 追求吞吐量虽风,同步塊執(zhí)行的時間長的場景
輕量級鎖 競爭的線程不會阻塞,提高程序的響應(yīng)速度 如果線程長時間得不到鎖寄月,那么自旋就會浪費CPU 追求響應(yīng)時間辜膝,同步塊執(zhí)行速度快
偏向鎖 加鎖和解鎖不需要額外的資源消耗 如果線程間存在競爭,會帶來額外的鎖撤銷的消耗 適用于只有一個線程訪問同步場景

2. volatile的應(yīng)用

volatile是輕量級的synchronized剥懒,volatile在多線程開發(fā)中保證了共享變量的可見性内舟,所謂可見性合敦,指的是當一個線程修改了共享變量之后初橘,對于其他線程來說,能夠讀到這個修改的值充岛。

1. volatile的定義及實現(xiàn)原理

volatile定義:Java編程語言允許線程訪問共享變量保檐,為了確保共享變量能被準確和一致地更新,線程應(yīng)該確保通過排他鎖獲得這個變量崔梗。
實現(xiàn)原理:當對聲明了volatile的變量進行寫操作時夜只,JVM就會向處理器發(fā)送一條帶有l(wèi)ock前綴的指令,將這個變量所在的緩存行的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存中蒜魄。同時扔亥,在多處理器的情況下,需要執(zhí)行緩存一致性協(xié)議谈为,即每個處理器都需要通過嗅探總線上傳播的數(shù)據(jù)來檢查自己的緩存是否過期旅挤,當處理器發(fā)現(xiàn)自己緩存行對應(yīng)的內(nèi)存地址被修改,就會將當前處理器的緩存行設(shè)置為無效伞鲫,當處理器需要對這個數(shù)據(jù)進行操作時粘茄,再從系統(tǒng)內(nèi)存中把數(shù)據(jù)讀取到緩存行中。

2. 實現(xiàn)volatile的兩條原則
  • 帶有Lock前綴的指令會引起處理器緩存寫回到內(nèi)存;
  • 一個處理器的緩存寫回到內(nèi)存柒瓣,會導(dǎo)致其他處理器的緩存無效儒搭。

3. 原子操作的原理

見文章[并發(fā)編程系列]Java中的原子操作類

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芙贫,隨后出現(xiàn)的幾起案子搂鲫,更是在濱河造成了極大的恐慌,老刑警劉巖磺平,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件默穴,死亡現(xiàn)場離奇詭異,居然都是意外死亡褪秀,警方通過查閱死者的電腦和手機蓄诽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媒吗,“玉大人仑氛,你說我怎么就攤上這事≌⒂ⅲ” “怎么了锯岖?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甫何。 經(jīng)常有香客問我出吹,道長,這世上最難降的妖魔是什么辙喂? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任捶牢,我火速辦了婚禮,結(jié)果婚禮上巍耗,老公的妹妹穿的比我還像新娘秋麸。我一直安慰自己,他們只是感情好炬太,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布灸蟆。 她就那樣靜靜地躺著,像睡著了一般亲族。 火紅的嫁衣襯著肌膚如雪炒考。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天霎迫,我揣著相機與錄音斋枢,去河邊找鬼。 笑死女气,一個胖子當著我的面吹牛杏慰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼缘滥,長吁一口氣:“原來是場噩夢啊……” “哼轰胁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起朝扼,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赃阀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后擎颖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榛斯,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年搂捧,在試婚紗的時候發(fā)現(xiàn)自己被綠了驮俗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡允跑,死狀恐怖王凑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情聋丝,我是刑警寧澤索烹,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站弱睦,受9級特大地震影響百姓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撞蜂。 院中可真熱鬧,春花似錦子库、人聲如沸舱权。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宴倍。三九已至张症,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸵贬,已是汗流浹背俗他。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阔逼,地道東北人兆衅。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羡亩。 傳聞我的和親對象是個殘疾皇子摩疑,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

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