JVM鎖優(yōu)化機制

synchronized關鍵字

在java里芒炼,使用的最基本互斥同步手段就是synchronized關鍵字趴久。synchronized關鍵字經(jīng)過Javac編譯后廷臼,會在同步代碼塊的前后分別形成一個monitorEnter 和 monitorExit 兩個字節(jié)碼指令蝗柔。這兩個字節(jié)碼指令都需要一個reference類型的參數(shù)來指明要鎖定和解鎖的對象改含。如果代碼中synchronized明確指定了對象情龄,那么就以這個對象的引用作為reference。如果沒有指定捍壤,那么將根據(jù)synchronized所修飾的方法類型(實例還是static)來決定是取代碼所在的對象實例還是方法對應的Class對象來作為線程持有的鎖骤视。

當前線程在執(zhí)行monitorEnter指令時,首先要去嘗試獲取對象的鎖鹃觉,如果對象沒有被鎖定专酗,或者當前線程已經(jīng)持有了鎖,則會把鎖的計數(shù)器加一帜慢,而在執(zhí)行monitorExit 指令時會將鎖計數(shù)器減一笼裳。一旦鎖計數(shù)器的值為0,鎖就等于是被釋放了粱玲。如果獲取對象鎖失敗躬柬,那么當前線程就應當被阻塞等待,直到請求鎖定的對象被持有它的線程釋放為止抽减。

可以看出允青,持有鎖是一個重量級的操作,因為如果要阻塞和喚醒一個線程卵沉,則需要操作系統(tǒng)來幫忙颠锉,同時會發(fā)生用戶態(tài)與內(nèi)核態(tài)的轉(zhuǎn)換法牲,這種狀態(tài)的轉(zhuǎn)換會額外消耗處理時間,尤其是對于代碼特別簡單的同步代碼塊(比如被synchronized關鍵字修飾的get或set)琼掠,狀態(tài)轉(zhuǎn)換消耗的時間可能超過了代碼執(zhí)行的時間拒垃,為了優(yōu)化這一問題,JVM引用了鎖優(yōu)化機制瓷蛙。

鎖優(yōu)化機制

1.鎖消除

鎖消除是指虛擬機即時編譯器在運行時悼瓮,對一些代碼要求同步,但是對被檢測刀不可能存在共享數(shù)據(jù)競爭的鎖進行消除艰猬。鎖消除的主要判定依據(jù)來源于逃逸分析的數(shù)據(jù)支持横堡,如果判斷到一段代碼中,在堆上的所有數(shù)據(jù)都不會逃逸出去被其他線程訪問到冠桃,那么則認為它們是線程私有的命贴,即不會進行加鎖操作。例如使用StringBuffer時食听,StringBuffer的append()中都有一個synchronized同步代碼塊胸蛛,但是如果經(jīng)過逃逸分析得出當前的StringBuffer實例不會被其他線程訪問到的話,就不會進行加鎖操作碳蛋。

2.鎖粗化

對與一系列的連續(xù)操作都對同一個對象反復加鎖和解鎖胚泌,甚至加鎖操作出現(xiàn)在循環(huán)體之中,那即使沒有線程競爭肃弟,頻繁的進行互斥同步操作也會導致不必要的性能損耗玷室。所以為了使加鎖操作數(shù)量盡可能的小,會對一些連續(xù)的對同一個對象反復加鎖和解鎖的情況笤受,會將鎖同步的范圍擴大到整個操作外部穷缤。

3.輕量級鎖

輕量級鎖:在代碼即將進入同步塊的時候,JVM默認會進行輕量級鎖的上鎖:如果此同步對象沒有被鎖定箩兽,則JVM會在當前線程的棧幀中建立一個鎖記錄的空間津肛,用于儲存鎖對象的Mark Word的拷貝(對象頭中儲存HashCode和分代年齡和偏向模式的二進制碼)。然后虛擬機會采用CAS操作嘗試把Mark Word更新為指向鎖記錄空間的指針汗贫,同時將鎖標志位改為00身坐,如果這個操作成功了,則代表當前線程獲得了該鎖落包。如果更新操作失敗了部蛇,說明有別的線程在競爭獲取該對象的鎖。虛擬機首先會去檢查對象的Mark Word是否指向當前線程的棧幀中的鎖記錄空間咐蝇,如果是涯鲁,則說明當前線程已經(jīng)擁有了鎖,繼續(xù)執(zhí)行同步代碼塊即可。否則就說明對象已經(jīng)被其他線程搶占了抹腿,此時輕量級鎖就不再有效岛请,必須膨脹為重量級鎖(互斥鎖),此時鎖對象Mark Word會重新指向重量級鎖的指針警绩,并把標志位改為10崇败。當不存在鎖競爭時,輕量級鎖通過CAS操作避免了使用互斥量的開銷肩祥,不過一旦有鎖競爭僚匆,不僅會有互斥量的開銷,也會有CSA操作帶來的開銷搭幻。(輕量級鎖膨脹為重量級鎖)

4.偏向鎖

偏向鎖(通過-XX:+UseBiasedLocking參數(shù)開啟):如果JVM開啟偏向鎖,那么當鎖對象第一次被線程獲取的時候逞盆,虛擬機會將對象頭中的標志為改為01檀蹋,同時使用CAS操作把獲取到鎖的線程ID記錄在對象頭中的Mark Word中(占用hashcode的空間,即偏向鎖的特征是鎖標志位為01云芦,且無hashcode)俯逾。如果CAS操作成功,持有偏向鎖的線程以后每次進入這個鎖相關的同步塊時舅逸,虛擬機不再進行任何同步操作(加鎖桌肴、解鎖,對mark word更新)琉历。不過一旦出現(xiàn)另外一個線程嘗試獲取這個鎖的情況坠七,偏向鎖就不再生效了,會根據(jù)當前對象鎖是否被持有來決定撤銷偏向鎖后將鎖的標志位更新為01(未鎖定)還是00(輕量級鎖)旗笔,后續(xù)的同步操作則按照輕量級鎖的操作去執(zhí)行彪置,且當前對象不能再進入到偏向鎖狀態(tài)(擁有hashcode的對象,無法進入偏向鎖狀態(tài))蝇恶。(偏向鎖膨脹為輕量級鎖)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拳魁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撮弧,更是在濱河造成了極大的恐慌潘懊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贿衍,死亡現(xiàn)場離奇詭異授舟,居然都是意外死亡,警方通過查閱死者的電腦和手機舌厨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門岂却,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事躏哩∈鸷疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵扫尺,是天一觀的道長筋栋。 經(jīng)常有香客問我,道長正驻,這世上最難降的妖魔是什么弊攘? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮姑曙,結(jié)果婚禮上襟交,老公的妹妹穿的比我還像新娘。我一直安慰自己伤靠,他們只是感情好捣域,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宴合,像睡著了一般焕梅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卦洽,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天贞言,我揣著相機與錄音,去河邊找鬼阀蒂。 笑死该窗,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蚤霞。 我是一名探鬼主播挪捕,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼争便!你這毒婦竟也來了级零?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤滞乙,失蹤者是張志新(化名)和其女友劉穎奏纪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斩启,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡序调,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兔簇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片发绢。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡硬耍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出边酒,到底是詐尸還是另有隱情经柴,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布墩朦,位于F島的核電站坯认,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏氓涣。R本人自食惡果不足惜牛哺,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劳吠。 院中可真熱鬧引润,春花似錦、人聲如沸痒玩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凰荚。三九已至,卻和暖如春褒脯,著一層夾襖步出監(jiān)牢的瞬間便瑟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工番川, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留到涂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓颁督,卻偏偏與公主長得像践啄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沉御,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

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