Java基礎-并發(fā)編程-鎖升級與鎖優(yōu)化

鎖升級過程就是鎖優(yōu)化

在JDK最開始的時候synchronized屬于重量級的鎖佑刷,每次加鎖都是通過操作系統(tǒng)申請鎖,所以會造成synchronized的效率比較低,尤其是隨著時代的發(fā)展,多線程高并發(fā)越來越多杖剪,synchronized效率低的缺點就越來越明顯,所以jdk對它進行了優(yōu)化驰贷,不再是一開始就向操作系統(tǒng)申請鎖盛嘿,分成偏向鎖 - 輕量級鎖 - 重量級鎖三個過程

要講鎖升級首先回顧一個知識點括袒,synchronized實際上是對對象加鎖的過程(鎖一段代碼則需指定對象次兆,如果鎖方法,普通方法鎖的是方法的對象锹锰,靜態(tài)方法則是這個方法所在類的calss對象)芥炭,在對象頭mark word最低的三位代表鎖狀態(tài)漓库,其中1位是偏向鎖位兩位是普通鎖位园蝠,具體如下圖:

image.png

這次主要關注mark word的后三位的變化渺蒿,根據變化我們可以得出實際上對象的鎖狀態(tài)可以分成無鎖、偏向鎖砰琢、輕量級鎖蘸嘶、重量級鎖4個狀態(tài)良瞧,GC過程中有對對象的鎖降級陪汽。

那么接下來就看看鎖是如何升級的,首先最開始對象是無鎖狀態(tài)褥蚯,當一個線程準備對這個對象加鎖前驗證這三個字節(jié)發(fā)現了無鎖狀態(tài)挚冤,把對象是否偏向設置為1,鎖標志位還是01赞庶,并把markword的線程ID改為當前線程ID训挡,此時對象處于偏向鎖狀態(tài)

一個線程繼續(xù)對該該對象加鎖歧强,發(fā)現是偏向鎖狀態(tài)澜薄,判斷偏向鎖線程是否是這個線程,如果是則是直接進入摊册,如果偏向線程不是當前線程肤京,也就是存在鎖競爭,那么就撤銷偏向鎖茅特,升級為輕量級鎖忘分。

輕量級鎖實現方式是各個線程在自己的線程棧生成LockRecord ,用CAS操作將markword設置為指向自己這個線程的LockRecord的指針白修,設置成功者得到鎖妒峦,沒有成功的將繼續(xù)使用CAS一直循環(huán)直到成功,所以輕量級鎖也叫自旋鎖兵睛。
JDK自旋有默認最大值是10次肯骇,JDK6對自旋鎖進行了優(yōu)化,自旋的時間不再是固定的祖很,而是由前一次在同一個鎖上的自旋時間及鎖的擁有者的狀態(tài)來決定的笛丙,比如當前線程在剛剛成功獲取過自旋鎖,那么虛擬機就會認為這次自旋也很有可能會成功突琳,那么循環(huán)次數就可以多進行幾次若债,這就叫自適應自旋。有了自適應自旋就不用我們設置最大循環(huán)次數拆融,由JVM監(jiān)控動態(tài)設置蠢琳。

自旋鎖有個缺點就是等待的線程仍然在自旋運行啊终,如果自旋的次數太多或者自旋等待的線程太多會造成CPU消耗過大,這種情況反而不如向操作系統(tǒng)來申請鎖傲须,阻塞其他線程蓝牲。所以在這種情況下鎖會升級成重量級鎖,沒有獲取到鎖的現在直接在系統(tǒng)級別被掛起泰讽,直到系統(tǒng)釋放鎖喚醒這些掛起的線程例衍,這些線程再次搶鎖。

鎖的升級過程畫了一個簡單的圖便于理解以上內容已卸,如下圖:

image.png

不重要的兩個鎖優(yōu)化

還有兩個不重要的鎖優(yōu)化還是要了解了解的佛玄。

第一個是鎖消除:當一段代碼中加了鎖,但是通過JVM分析他是線程安全的累澡,那么JVM會把鎖去掉梦抢。比如方法中一段代碼有加鎖,但是經過分析不會出現線程安全的問題愧哟,那么JVM就會把鎖給消除奥吩。

第二個是鎖粗化:當JVM檢測到一段連續(xù)的多次操作都在對同一個對象多次加鎖,那么JVM可能會優(yōu)化成對這整段加一個鎖蕊梧,沒有把加鎖的操作分的那么細霞赫,所以叫鎖粗化。

具體代碼案例如下圖:

image.png

總結

鎖升級主要分為偏向鎖 - 輕量級鎖 - 重量級鎖三層肥矢。
偏向鎖端衰、輕量級鎖是在Java內部的優(yōu)化,屬于所謂的用戶態(tài)橄抹,而重量級鎖則是向操作系統(tǒng)申請靴迫,屬于內核態(tài)
在鎖競爭不激烈的時候由jvm自己解決肯定性能是最好的楼誓,但是jvm通過自旋方式解決會消耗CPU性能玉锌,所以在鎖競爭激烈的情況下重量級鎖性能更好

鎖升級是機制層面的優(yōu)化疟羹,而鎖消除和鎖粗化則是jvm對代碼層面的優(yōu)化主守。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市榄融,隨后出現的幾起案子参淫,更是在濱河造成了極大的恐慌,老刑警劉巖愧杯,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涎才,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機耍铜,發(fā)現死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門邑闺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棕兼,你說我怎么就攤上這事陡舅。” “怎么了伴挚?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵靶衍,是天一觀的道長。 經常有香客問我茎芋,道長颅眶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任败徊,我火速辦了婚禮帚呼,結果婚禮上,老公的妹妹穿的比我還像新娘皱蹦。我一直安慰自己,他們只是感情好眷蜈,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布沪哺。 她就那樣靜靜地躺著,像睡著了一般酌儒。 火紅的嫁衣襯著肌膚如雪辜妓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天忌怎,我揣著相機與錄音籍滴,去河邊找鬼。 笑死榴啸,一個胖子當著我的面吹牛孽惰,可吹牛的內容都是我干的。 我是一名探鬼主播鸥印,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼勋功,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了库说?” 一聲冷哼從身側響起狂鞋,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎潜的,沒想到半個月后骚揍,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡啰挪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年信不,在試婚紗的時候發(fā)現自己被綠了纤掸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡浑塞,死狀恐怖借跪,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情酌壕,我是刑警寧澤掏愁,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站卵牍,受9級特大地震影響果港,放射性物質發(fā)生泄漏。R本人自食惡果不足惜糊昙,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一辛掠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧释牺,春花似錦萝衩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至祭刚,卻和暖如春牌捷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涡驮。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工暗甥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捉捅。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓撤防,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锯梁。 傳聞我的和親對象是個殘疾皇子即碗,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容