面試官:JVM對(duì)鎖進(jìn)行了優(yōu)化闰渔,都優(yōu)化了啥席函?

從JDK1.6開(kāi)始,JVM對(duì)鎖進(jìn)行了各種優(yōu)化冈涧,目的就是為了在線程間更高效的共享數(shù)據(jù)和解決互斥同步的問(wèn)題茂附。從鎖優(yōu)化的話題開(kāi)始,可以引申出很多考點(diǎn)面試題督弓,比如鎖優(yōu)化的技術(shù)营曼、各優(yōu)化技術(shù)的細(xì)節(jié)、CAS實(shí)現(xiàn)原理咽筋、CAS的ABA問(wèn)題及如何解決等溶推,持續(xù)發(fā)散還會(huì)引發(fā)更多問(wèn)題徊件,例如逃逸分析等奸攻,可以看出技術(shù)點(diǎn)都是相關(guān)聯(lián)的蒜危,需要不斷積累和梳理。

面試官:JVM實(shí)現(xiàn)了哪些鎖優(yōu)化技術(shù)睹耐?

小白:自旋鎖辐赞、自適應(yīng)自旋鎖、鎖粗化硝训、鎖消除响委、偏向鎖、輕量級(jí)鎖窖梁。

試官:介紹一下自旋鎖赘风?為什么引入自旋鎖?

小白:自旋鎖就是在請(qǐng)求獲取鎖纵刘,又不能馬上獲取到時(shí)邀窃,讓當(dāng)前線程在不放棄處理器執(zhí)行時(shí)間的情況下執(zhí)行忙循環(huán),嘗試等待鎖被釋放假哎,再獲取鎖瞬捕。引入自旋鎖是為了節(jié)省線程掛起和恢復(fù)的開(kāi)銷。

面試官:你剛剛說(shuō)引入自旋鎖節(jié)省了線程掛起和恢復(fù)的開(kāi)銷舵抹,但循環(huán)也是需要占用處理器時(shí)間的肪虎,那這個(gè)自旋的次數(shù)如何控制?

小白:默認(rèn)是10次惧蛹,也可以通過(guò)JVM參數(shù)-XX:PreBlockSpin配置扇救,當(dāng)然這些自旋都是固定的,所以引入了自適應(yīng)自旋鎖赊淑,自旋的次數(shù)由前一次在同一個(gè)鎖上的自旋次數(shù)和鎖的擁有者的狀態(tài)來(lái)決定爵政。如果前面線程成功獲取鎖并且正常運(yùn)行,那么本次獲取鎖的可能性很大陶缺,所以自旋的次數(shù)相對(duì)多一些钾挟;如果前面線程很少成功獲取鎖,那么本次獲取鎖的概率也很小饱岸,就可能不執(zhí)行自旋了掺出。

面試官:鎖粗化優(yōu)化了什么?

小白:如果在一段代碼中同一線程反復(fù)獲取苫费、釋放同一個(gè)對(duì)象的鎖汤锨,將會(huì)生產(chǎn)不必要的性能開(kāi)銷,所以需要把獲鎖的范圍擴(kuò)大百框,對(duì)同一個(gè)對(duì)象的鎖操作只進(jìn)行一次闲礼,在頭部獲取鎖,在尾部釋放鎖。

面試官:鎖消除是什么柬泽?

小白:鎖消除是指JIT在運(yùn)行時(shí)分析到使用了鎖的同步代碼在實(shí)際運(yùn)行時(shí)不可能存在共享數(shù)據(jù)被競(jìng)爭(zhēng)的情況慎菲,對(duì)鎖進(jìn)行去除。例如如果一個(gè)局部變量在方法內(nèi)部不可能被外部引用锨并,那么它就不需要加鎖控制露该,可以去掉鎖。(注意:如果你的回答中提到了逃逸分析第煮,面試官很有可能會(huì)問(wèn)你什么是逃逸分析解幼,提前做好準(zhǔn)備)

面試官:詳細(xì)說(shuō)一下偏向鎖?

小白:偏向鎖就是如果線程持有了鎖包警,在后續(xù)的過(guò)程中撵摆,只要該鎖沒(méi)有被其它線程持有,那么持有偏向鎖的線程將不再需要進(jìn)行同步操作害晦。這個(gè)偏向鎖的相關(guān)信息是保存在Java對(duì)象的對(duì)象頭中的台汇。在HotSpot虛擬機(jī)中,Java對(duì)象在內(nèi)存中存儲(chǔ)的布局分為3塊區(qū)域:對(duì)象頭篱瞎、實(shí)例數(shù)據(jù)和對(duì)齊填充苟呐。對(duì)象頭包含兩部分,第一部分包含對(duì)象的HashCode俐筋、分代年齡牵素、鎖標(biāo)志位、線程持有的鎖澄者、偏向線程ID等數(shù)據(jù)笆呆,這部分?jǐn)?shù)據(jù)的長(zhǎng)度在32位和64位虛擬機(jī)中分別為32bit和64bit,官方稱為Mark World粱挡。下圖展示了不同狀態(tài)下赠幕,對(duì)象頭中存儲(chǔ)的內(nèi)容:

一個(gè)普通Java對(duì)象剛開(kāi)始是處于無(wú)鎖狀態(tài)的,Mark World中存儲(chǔ)的數(shù)據(jù)如上圖中的第一行所示询筏。當(dāng)虛擬機(jī)啟動(dòng)了偏向鎖榕堰,鎖對(duì)象第一次被線程獲取的時(shí)候,鎖標(biāo)識(shí)位置為01嫌套,同時(shí)使用CAS將獲取到這個(gè)鎖的線程ID設(shè)置到Mark World中逆屡,如果CAS操作成功,那么這個(gè)線程將可以繼續(xù)執(zhí)行相關(guān)的同步代碼踱讨。如果此時(shí)有其它線程嘗試獲取鎖魏蔗,有兩種情況,一種是鎖對(duì)象未被鎖定痹筛,則偏向鎖被撤銷莺治,恢復(fù)到無(wú)鎖狀態(tài)廓鞠;另一種是對(duì)象被鎖定,那么偏向鎖失效谣旁,同時(shí)升級(jí)為輕量級(jí)鎖诫惭,會(huì)在當(dāng)前線程的棧幀中創(chuàng)建一個(gè)鎖記錄的空間,這個(gè)空間存儲(chǔ)對(duì)象頭中Mark World的拷貝蔓挖,就是復(fù)制一份到這個(gè)鎖記錄空間,同時(shí)虛擬機(jī)使用CAS嘗試將這個(gè)鎖記錄空間的指針更新到Mark World馆衔,如果CAS操作成功瘟判,那么當(dāng)前線程獲取到鎖,此時(shí)鎖狀態(tài)處于輕量級(jí)鎖角溃,鎖標(biāo)志位置為00拷获。

面試官:你剛剛說(shuō)到虛擬機(jī)使用CAS進(jìn)行更新操作,Java中的CAS是什么及如何實(shí)現(xiàn)的减细?

小白:CAS(Compare and swap)是比較和替換匆瓜,是一種通過(guò)硬件實(shí)現(xiàn)并發(fā)安全的常用技術(shù),底層通過(guò)利用CPU的CAS指令對(duì)緩存加鎖或總線加鎖的方式來(lái)實(shí)現(xiàn)多處理器之間的原子操作未蝌。它的實(shí)現(xiàn)過(guò)程是驮吱,有3個(gè)操作數(shù),內(nèi)存值V萧吠,舊的預(yù)期值E左冬,要修改的新值U,當(dāng)且僅當(dāng)預(yù)期值E和內(nèi)存值V相同時(shí)纸型,才將內(nèi)存值V修改為U拇砰,否則什么都不做。CAS底層實(shí)現(xiàn)使用了C++狰腌,在其代碼中會(huì)根據(jù)操作系統(tǒng)和處理器的不同來(lái)選擇對(duì)應(yīng)的調(diào)用代碼除破,以Windows和x86處理器為例,如果是多處理器琼腔,通過(guò)帶lock前綴的cmpxchg指令對(duì)緩存加鎖或總線加鎖的方式來(lái)實(shí)現(xiàn)多處理器之間的原子操作瑰枫;如果是單處理器,通過(guò)cmpxchg指令完成原子操作丹莲。

面試官:那你知道CAS中的ABA問(wèn)題嗎躁垛?

小白:知道,CAS是當(dāng)且僅當(dāng)舊的預(yù)期值E和內(nèi)存值V相同時(shí)圾笨,才將內(nèi)存值V修改為U教馆,也就是如果內(nèi)存值V沒(méi)有發(fā)生變化則更新,但是有可能發(fā)生內(nèi)存值原來(lái)是A擂达,中間被改成B土铺,后來(lái)又被改成A,此時(shí)再使用CAS進(jìn)行檢查時(shí)發(fā)現(xiàn)沒(méi)有變化,但是實(shí)際上發(fā)生了變化悲敷,這就是ABA問(wèn)題究恤。

面試官:這個(gè)問(wèn)題如何解決?

小白:Java并發(fā)包下的AtomicStampedReference可以解決ABA問(wèn)題后德,內(nèi)部實(shí)現(xiàn)上添加了一個(gè)類似于版本號(hào)作用的stamp屬性部宿,它是被自動(dòng)更新的。實(shí)現(xiàn)上首先檢查當(dāng)前引用是否等于預(yù)期引用瓢湃、當(dāng)前stamp是否等于預(yù)期stamp理张,如果全部相等,則以原子方式將該引用和該stamp的值設(shè)置為給定的更新值绵患。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雾叭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子落蝙,更是在濱河造成了極大的恐慌织狐,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筏勒,死亡現(xiàn)場(chǎng)離奇詭異移迫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)管行,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)起意,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人病瞳,你說(shuō)我怎么就攤上這事揽咕。” “怎么了套菜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵亲善,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我逗柴,道長(zhǎng)蛹头,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任戏溺,我火速辦了婚禮渣蜗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旷祸。我一直安慰自己耕拷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布托享。 她就那樣靜靜地躺著骚烧,像睡著了一般浸赫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赃绊,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天既峡,我揣著相機(jī)與錄音,去河邊找鬼碧查。 笑死运敢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忠售。 我是一名探鬼主播传惠,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼档痪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起邢滑,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腐螟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后困后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體乐纸,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年摇予,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汽绢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侧戴,死狀恐怖宁昭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酗宋,我是刑警寧澤积仗,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站蜕猫,受9級(jí)特大地震影響寂曹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜回右,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一隆圆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翔烁,春花似錦渺氧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颊糜。三九已至,卻和暖如春秃踩,著一層夾襖步出監(jiān)牢的瞬間衬鱼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工憔杨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸟赫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓消别,卻偏偏與公主長(zhǎng)得像抛蚤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寻狂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • ps: 這篇文章看資料時(shí)頭疼岁经,寫(xiě)起來(lái)時(shí)更頭疼,寫(xiě)完了說(shuō)實(shí)話也沒(méi)多大用蛇券,充其量也就是多了解了一些鎖的內(nèi)容缀壤,也許扣字眼...
    前行的烏龜閱讀 1,537評(píng)論 0 5
  • 多線程同步 為何要使用同步? java允許多線程并發(fā)控制纠亚,當(dāng)多個(gè)線程同時(shí)操作一個(gè)可共享的資源變量時(shí)(如數(shù)據(jù)的增刪改...
    關(guān)耳木水閱讀 559評(píng)論 0 0
  • 為什么買(mǎi)了股票塘慕,無(wú)論是漲了還是跌了拿不住 武哥: 厚德載物,德行無(wú)法承載它 萌萌:因?yàn)椴淮_定 小輝:因?yàn)椴豢次磥?lái) ...
    guligei閱讀 523評(píng)論 0 0
  • 上個(gè)周末蒂胞,在班車(chē)上图呢,中途上來(lái)一位老奶奶,大約六七十歲的樣子骗随,穿著深色的棉襖蛤织,棉褲,棉鞋鸿染,費(fèi)力的爬上班車(chē)瞳筏。 “這么大...
    善護(hù)念之合一閱讀 409評(píng)論 1 6
  • 姓名:葉彩霞 【日精進(jìn)打卡第450天】2019.07.04 第367期(無(wú)錫市) 樂(lè)觀三組 學(xué)員 【知~學(xué)習(xí)】 ...
    透明的水泡閱讀 128評(píng)論 0 0