JVM對鎖的優(yōu)化

自旋鎖和自適應(yīng)自旋鎖

為何引入

互斥同步最大的性能消耗在于阻塞的實(shí)現(xiàn)泡垃。即線程的掛起和喚醒必須轉(zhuǎn)入內(nèi)核態(tài)中實(shí)現(xiàn)幌甘,線程的切換即內(nèi)核態(tài)和用戶態(tài)的切換給并發(fā)性能帶來了很大的消耗。

針對場景

假設(shè)某個線程所持有互斥鎖的時間很短须板。
這樣我們可以讓等待鎖的線程不進(jìn)行休眠榛鼎,而進(jìn)行自旋(比如循環(huán)100次)逃呼,這樣的做法避免了線程的切換。
如果某些線程鎖持有鎖的時間很長這樣做就不行了者娱。

自旋鎖的優(yōu)化--自適應(yīng)自旋鎖

即優(yōu)化每次自旋的時間抡笼。我們可以根據(jù)上一次這個互斥鎖等待的時間以及線程的狀態(tài)等信息,來決定此次是否自旋以及自旋的時間黄鳍。這樣自旋的時間就變成動態(tài)的了推姻。

額外

自旋鎖自1.6開始后默認(rèn)就是開啟的。

鎖清除

為何引入

在一些代碼中加入了互斥同步鎖际起,但實(shí)際上并不可能存在同步現(xiàn)象拾碌。我們需要將這些互斥同步鎖清除掉吐葱。

針對場景

鎖清除現(xiàn)象發(fā)生在即時編譯器運(yùn)行時街望。
如何判定代碼中的互斥同步鎖是多余的呢校翔?
主要依據(jù):逃逸技術(shù)。--即在一段代碼中灾前,發(fā)現(xiàn)堆中的所有數(shù)據(jù)都不會逃逸出去而被其他線程訪問防症,則就可認(rèn)為它們是線程私有的。

鎖粗化

為何引入

原則上我們是希望加鎖的代碼塊越小越好哎甲。但如果一段代碼中頻繁地對某個對象進(jìn)行加鎖和解鎖蔫敲。這樣也會導(dǎo)致消耗性能。

針對場景

當(dāng)虛擬機(jī)檢測到一段代碼頻繁地對同一個對象進(jìn)行加鎖和解鎖時炭玫,就會將鎖范圍擴(kuò)大到這段代碼之外奈嘿,進(jìn)行一次加鎖和解鎖就好了。

輕量鎖

針對場景

對于大部分的鎖吞加,在整個同步周期內(nèi)都不存在競爭裙犹。
--這胡話的意思是:一段代碼在被某個線程上鎖到解鎖的過程中不會存在其他線程來欲訪問這段代碼。

具體優(yōu)化
  • 加鎖:當(dāng)前線程執(zhí)行CAS操作衔憨。如果成功則繼續(xù)執(zhí)行同步代碼叶圃,失敗說明有其他線程占有。如果有兩個線程爭用同一個鎖践图,則輕量鎖不再生效掺冠,膨脹為重量級鎖。
  • 解鎖:也是通過使用CAS操作來完成码党。

這里說一下:

  1. 輕量鎖是可以膨脹為重量級鎖的
  2. 輕量鎖之所以高效德崭,是因?yàn)榧渔i和解鎖只使用了CAS操作而不是使用系統(tǒng)互斥量。兩者的性能差別很大揖盘。
  3. 在有互斥鎖的競爭下眉厨,輕量鎖的效率很低。因?yàn)槌耸褂没コ饬客膺€額外加了CAS操作扣讼。
  4. 具體的CAS操作這里就不多說了缺猛。

偏向鎖

針對場景
  • 偏向鎖的“偏”是指偏向第一個獲得鎖的線程,如果接下來的過程中椭符,沒有其他線程獲得鎖荔燎,則第一個線程將永遠(yuǎn)無需做同步操作。
  • 輕量鎖是在無競爭狀態(tài)在使用CAS來代替互斥量销钝,而偏向鎖是在無競爭狀態(tài)在把整個同步都消除掉有咨,連CAS都省了。
  1. 既然無需CAS操作蒸健,是不是啟用一定會提高效率座享。其實(shí)并不是婉商,如果鎖總是被不同線程訪問,那么偏向鎖就是多余的渣叛。
  2. 如果偏向鎖無效之后丈秩,可以膨脹為輕量鎖。

總結(jié)

  1. 自旋鎖淳衙、鎖清除蘑秽、鎖粗化都是默認(rèn)開啟的,他們的存在會提高效率箫攀。
  2. 偏向鎖和輕量鎖是在特殊的場景下肠牲,才可以提高性能。否則還會降低性能靴跛。
  3. 偏向鎖可以膨脹為輕量鎖缀雳,輕量鎖可以膨脹為重量級鎖。不可反向膨脹梢睛。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肥印,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扬绪,更是在濱河造成了極大的恐慌竖独,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挤牛,死亡現(xiàn)場離奇詭異莹痢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)墓赴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門竞膳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诫硕,你說我怎么就攤上這事坦辟。” “怎么了章办?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵锉走,是天一觀的道長。 經(jīng)常有香客問我藕届,道長挪蹭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任休偶,我火速辦了婚禮梁厉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踏兜。我一直安慰自己词顾,他們只是感情好八秃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肉盹,像睡著了一般昔驱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垮媒,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天舍悯,我揣著相機(jī)與錄音航棱,去河邊找鬼睡雇。 笑死,一個胖子當(dāng)著我的面吹牛饮醇,可吹牛的內(nèi)容都是我干的它抱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼朴艰,長吁一口氣:“原來是場噩夢啊……” “哼观蓄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起祠墅,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤侮穿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后毁嗦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亲茅,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年狗准,在試婚紗的時候發(fā)現(xiàn)自己被綠了克锣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡腔长,死狀恐怖袭祟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捞附,我是刑警寧澤巾乳,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鸟召,受9級特大地震影響胆绊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜药版,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一辑舷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧槽片,春花似錦何缓、人聲如沸肢础。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽传轰。三九已至,卻和暖如春谷婆,著一層夾襖步出監(jiān)牢的瞬間慨蛙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工纪挎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留期贫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓异袄,卻偏偏與公主長得像通砍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烤蜕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

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