JVM鎖優(yōu)化

synchronized重量級鎖

synchronized是通過對象內(nèi)部的一個叫做監(jiān)視器鎖(monitor)來實現(xiàn)的贯卦。但是監(jiān)視器鎖本質(zhì)又是依賴于底層的操作系統(tǒng)的Mutex Lock來實現(xiàn)的横侦。而操作系統(tǒng)實現(xiàn)線程之間的切換這就需要從用戶態(tài)轉(zhuǎn)換到核心態(tài)巧涧,這個成本非常高,狀態(tài)之間的轉(zhuǎn)換需要相對比較長的時間急膀,這就是為什么synchronized效率低的原因喻旷。因此住册,這種依賴于操作系統(tǒng)Mutex Lock所實現(xiàn)的鎖我們稱之為“重量級鎖”。JDK 1.6 后對synchronized做的種種優(yōu)化雹拄,其核心都是為了減少這種重量級鎖的使用收奔,如適應性自旋,鎖清除滓玖,鎖粗化坪哄,輕量級鎖,偏向鎖势篡。


自旋鎖

首先是一種鎖翩肌,與互斥鎖相似,基本作用是用于線程(進程)之間的同步禁悠。與普通鎖不同的是念祭,一個線程A在獲得普通鎖后,如果再有線程B試圖獲取鎖碍侦,那么這個線程B將會掛起(阻塞)棒卷;試想下顾孽,如果兩個線程資源競爭不是特別激烈,而處理器阻塞一個線程引起的線程上下文的切換的代價高于等待資源的代價的時候(鎖的已保持者保持鎖時間比較短)比规,那么線程B可以不放棄CPU時間片若厚,而是在“原地”忙等,直到鎖的持有者釋放了該鎖蜒什,這就是自旋鎖的原理测秸,可見自旋鎖是一種非阻塞鎖(JDK 1.6 中是默認開啟的)。用戶可以通過參數(shù)更改:-XX:-UseSpinning來關(guān)閉灾常。

自旋鎖可能引起的問題:自旋鎖雖然避免了線程之間切換的開銷霎冯,但它是要占CPU時間的,因此鎖被占用的時間越短钞瀑,自旋等待的效果就越好沈撞,反之,鎖被占用的時間很長雕什,那么自旋的線程只會白白消耗CPU資源缠俺。因此自旋等待的時間必須有一個限度,如果超過這個限度仍然沒有獲得鎖贷岸,就應當按照傳統(tǒng)方式掛起線程壹士。自旋的次數(shù)默認是10,用戶可以通過參數(shù)更改:-XX:PreBlockSpin=11偿警。

在JDK 1.6 之后引入了自適應的自旋鎖躏救。自適應意味著自旋的時間不在固定了,而是由前一次在同一個鎖上的自旋時間及鎖的擁有者的狀態(tài)決定的螟蒸。


鎖清除盒使,鎖粗化

StringBuffer 中的append方法是被synchronized方法修飾的,所以存在鎖七嫌。

鎖清除:由于sb是局部變量忠怖,所以不會產(chǎn)生線程安全問題,鎖可以被清除


鎖粗化:sb由于多次append抄瑟,所以鎖可以擴展到第一個append()操作到最后一個append()操作凡泣,只需要加一次鎖




Mark Word

輕量級鎖

輕量級是相對于使用操作系統(tǒng)互斥量來實現(xiàn)的傳統(tǒng)鎖而言的。但是皮假,首先需要強調(diào)一點的是鞋拟,輕量級鎖并不是用來代替重量級鎖的,它的本意是在沒有多線程競爭的前提下惹资,減少傳統(tǒng)的重量級鎖使用產(chǎn)生的性能消耗贺纲。在解釋輕量級鎖的執(zhí)行過程之前,先明白一點褪测,輕量級鎖所適應的場景是線程交替執(zhí)行同步塊的情況猴誊,如果存在同一時間訪問同一鎖的情況潦刃,就會導致輕量級鎖膨脹為重量級鎖。

加鎖:

1) 在代碼進入同步塊的時候懈叹,如果此對象沒有被鎖定(鎖標志位為“01”狀態(tài)乖杠,是否為偏向鎖為“0”),JVM首先在當前線程的棧幀建立一個名為鎖記錄的(Lock Record)的空間澄成,用于存儲對象當前的Mark Word(官方稱之為 Displaced Mark Word)胧洒。

2 ) ?JVM使用CAS操作嘗試將對象的Mark Word 更新為指向Lock Record 的指針。

如果這個操作成功墨状,那么這個線程就擁有了該對象的鎖卫漫,并且將對象的Mark Word 的鎖標志位轉(zhuǎn)變?yōu)?00",即表示該對象處于輕量級鎖狀態(tài)肾砂。


如果這個更新操作失敗了列赎,虛擬機首先會檢查對象的Mark Word是否指向當前線程的棧幀,如果是就說明當前線程已經(jīng)擁有了這個對象的鎖镐确,那就可以直接進入同步塊繼續(xù)執(zhí)行包吝。否則說明多個線程競爭鎖,輕量級鎖就要膨脹為重量級鎖辫塌,鎖標志的狀態(tài)值變?yōu)椤?0”漏策,Mark Word中存儲的就是指向重量級鎖(互斥量)的指針派哲,后面等待鎖的線程也要進入阻塞狀態(tài)臼氨。

解鎖:

1)通過CAS操作嘗試把線程中復制的Displaced Mark Word對象替換當前的Mark Word。

2)如果替換成功芭届,整個同步過程就完成了储矩。

3)如果替換失敗,說明有其他線程嘗試過獲取該鎖(此時鎖已膨脹)褂乍,那就要在釋放鎖的同時持隧,喚醒被掛起的線程。


偏向鎖

偏向鎖的“偏”逃片,就是偏心的“偏”屡拨,它的意思就是這個鎖會偏向于第一個獲取它的線程,如果在接下來的執(zhí)行過程中褥实,該鎖沒有被其他線程獲取呀狼,則持有偏向鎖的線程永遠不需要再進行同步。

引入偏向鎖是為了在無多線程競爭的情況下盡量減少不必要的輕量級鎖執(zhí)行路徑损离,因為輕量級鎖的獲取及釋放依賴多次CAS原子指令哥艇,而偏向鎖只需要在置換Thread ID的時候依賴一次CAS原子指令(由于一旦出現(xiàn)多線程競爭的情況就必須撤銷偏向鎖,所以偏向鎖的撤銷操作的性能損耗必須小于節(jié)省下來的CAS原子指令的性能消耗)僻澎。輕量級鎖是為了在線程交替執(zhí)行同步塊時提高性能貌踏,而偏向鎖則是在只有一個線程執(zhí)行同步塊時進一步提高性能十饥。

當有另外一個線程去嘗試獲取這個鎖時,偏向模式就宣告結(jié)束祖乳。根據(jù)鎖對象目前是否處于被鎖定的狀態(tài)逗堵,撤銷偏向(Revoke Bias)后恢復到未鎖定(標志位為01)或者輕量級鎖(標志位為00)的狀態(tài),后續(xù)的同步操作就如輕量級鎖那樣執(zhí)行凡资。轉(zhuǎn)換圖:

參考:

http://blog.csdn.net/truong/article/details/74942155

http://blog.csdn.net/truong/article/details/74941345

http://blog.csdn.net/hsuxu/article/details/9472389

http://blog.csdn.net/hsuxu/article/details/9472381

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砸捏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子隙赁,更是在濱河造成了極大的恐慌垦藏,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伞访,死亡現(xiàn)場離奇詭異掂骏,居然都是意外死亡,警方通過查閱死者的電腦和手機厚掷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門弟灼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冒黑,你說我怎么就攤上這事田绑。” “怎么了抡爹?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵掩驱,是天一觀的道長。 經(jīng)常有香客問我冬竟,道長欧穴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任泵殴,我火速辦了婚禮涮帘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笑诅。我一直安慰自己调缨,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布吆你。 她就那樣靜靜地躺著弦叶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪早处。 梳的紋絲不亂的頭發(fā)上湾蔓,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音砌梆,去河邊找鬼默责。 笑死贬循,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的桃序。 我是一名探鬼主播杖虾,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼媒熊!你這毒婦竟也來了奇适?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤芦鳍,失蹤者是張志新(化名)和其女友劉穎嚷往,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柠衅,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡皮仁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了菲宴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贷祈。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖喝峦,靈堂內(nèi)的尸體忽然破棺而出势誊,到底是詐尸還是另有隱情,我是刑警寧澤谣蠢,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布粟耻,位于F島的核電站,受9級特大地震影響漩怎,放射性物質(zhì)發(fā)生泄漏勋颖。R本人自食惡果不足惜嗦嗡,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一勋锤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侥祭,春花似錦叁执、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胎署,卻和暖如春吆录,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背琼牧。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工恢筝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哀卫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓撬槽,卻偏偏與公主長得像此改,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子侄柔,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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