<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          你好,面試官 | 百度是這樣問(wèn) synchronized 的.....

          共 3769字,需瀏覽 8分鐘

           ·

          2022-06-06 18:22

          本期是【你好,面試官】系列文章的第9期,持續(xù)更新中.....。

          回復(fù)"面試筆記"【點(diǎn)擊獲取小龍秋招面試筆記,已助力 N 名同學(xué)斬獲offer~,速來(lái)。

          你好,面試官》系列目前已經(jīng)連載9篇了,據(jù)說(shuō)看了這個(gè)系列的朋友都拿到了大廠offer~

          小龍有話說(shuō)

          本期會(huì)通過(guò)面試模擬復(fù)現(xiàn)百度提前批二面,關(guān)于 synchronized 的考察,以此講解其原理。

          本期題改編自 ——2022屆秋招 百度 二面

          面試現(xiàn)場(chǎng)

          叮叮叮......

          面試官:“你好,我是XX面試官,請(qǐng)問(wèn)是小龍嗎?”

          小龍:“您好,面試官,我是小龍”

          面試官:“好的,現(xiàn)在有空嗎,我們開(kāi)始面試吧”

          小龍:“嗯嗯,準(zhǔn)備好啦”

          .......

          other questions

          .......

          面試官:“synchronized 分別修飾了一個(gè)靜態(tài)方法和一個(gè)實(shí)例方法,現(xiàn)在對(duì)其并發(fā)訪問(wèn),這是否線程安全?”

          獨(dú)白:“我記不太清原問(wèn)題咋問(wèn)的了,反正大概考的知識(shí)點(diǎn)就是這個(gè),不是直白的考,而是給你一個(gè)實(shí)際例子叫你分析

          獨(dú)白:“當(dāng)時(shí)可能剛開(kāi)始面試第一個(gè)問(wèn)題還沒(méi)進(jìn)入狀態(tài),又有點(diǎn)緊張,面試官說(shuō)話又不清楚,所以一下還沒(méi)反應(yīng)過(guò)來(lái),卡了幾秒,映像比較深刻。

          小龍:“這個(gè)當(dāng)然不安全,因?yàn)樵L問(wèn)靜態(tài) synchronized 方法鎖的是當(dāng)前類(lèi)的Class對(duì)象,而訪問(wèn)非靜態(tài) synchronized 方法鎖的是當(dāng)前實(shí)例對(duì)象?!?/p>

          面試官:“好的,那你知道 synchronized 實(shí)現(xiàn)加鎖的本質(zhì)原理嗎?”

          獨(dú)白:“這個(gè)不就是 monitorenter 那兩條命令嗎,拿捏~

          小龍:“如果 synchronized 修飾代碼塊,javac 編譯時(shí),會(huì)在代碼塊前后生成 monitorentermonitorexit ,當(dāng)執(zhí)行遇到 monitorenter指令便會(huì)去嘗試獲取鎖?!?/p>

          獨(dú)白:“以為拿捏了,為了讓面試官覺(jué)得我理解的很透徹,再補(bǔ)充了一點(diǎn)。

          小龍:“使用 synchronized 在出現(xiàn)異常時(shí),還可以保證鎖的釋放。因?yàn)樗€會(huì)隱式的加一個(gè) try-finnaly,finnaly 中也有 monitorexit 命令以便出現(xiàn)異??梢葬尫沛i。”

          面試官:“好的,你說(shuō)的這些沒(méi)問(wèn)題,那你知道當(dāng)執(zhí)行到 monitorenter 指令時(shí),它是怎樣去嘗試獲取鎖的嗎?這個(gè)鎖究竟是啥?你還是沒(méi)說(shuō)明白呢,哈哈。”

          獨(dú)白:“原來(lái)想問(wèn) ?monitor 噢,還是很基礎(chǔ)的,幸好這些在【面試筆記】都詳細(xì)總結(jié)過(guò)。

          小龍:“其實(shí)追根朔源,每個(gè)對(duì)象都有一個(gè) monitor 與之關(guān)聯(lián),而當(dāng)且一個(gè) monitor 被持有后,它便處于鎖定狀態(tài)啦,而線程執(zhí)行到 monitorenter 指令時(shí),便會(huì)嘗試獲取對(duì)象所對(duì)應(yīng)的 monitor 的所有權(quán),即嘗試獲得對(duì)象的鎖?!?/p>

          Moniter=WaitSet+EntryList(當(dāng)鎖被占用,其他線程來(lái)就會(huì)進(jìn)入阻塞隊(duì)列,等鎖釋放再一起競(jìng)爭(zhēng))+Owner(指向持有鎖的線程)

          面試官:“真的是這樣嗎?還有嗎?”

          小龍:"你別急嘛,我還沒(méi)說(shuō)完,上面說(shuō)法其實(shí)不完全正確,那是針對(duì)重量級(jí)鎖。"

          小龍:“如果是 synchronized 沒(méi)被優(yōu)化之前,它是重量級(jí)鎖,僅依賴對(duì)象對(duì)應(yīng)的 moniter,但是后面進(jìn)行了優(yōu)化?!?/p>

          面試官:“噢,展開(kāi)說(shuō)說(shuō)?!?/p>

          小龍:“我們的對(duì)象總的來(lái)說(shuō)是由 對(duì)象頭、實(shí)例數(shù)據(jù)、對(duì)齊填充構(gòu)成,而對(duì)象頭里面就存了 Mark Word,Mark Word 里面存了對(duì)象自身的一些運(yùn)行信息,比如:hashcode、GC分代年齡、鎖狀態(tài)標(biāo)志、持有的鎖?!?/p>

          小龍:“若 synchronized 給該對(duì)象加鎖后,那么該對(duì)象頭的 Mark Word 就會(huì)發(fā)生相應(yīng)的變化,優(yōu)化后的 synchronized 會(huì)迎合不同場(chǎng)景升級(jí)鎖,隨著鎖升級(jí),這個(gè)變化也不同。”

          小龍:“偏向鎖依賴 當(dāng)前線程ID,重量級(jí)鎖依賴 monitor ,輕量級(jí)鎖依賴 鎖記錄lock-record。”

          獨(dú)白:“應(yīng)該是說(shuō)清楚啦,更多裝逼小技巧看【面試筆記

          面試官:“好的,你說(shuō)詳細(xì)說(shuō)一下鎖的升級(jí)過(guò)程嗎?”

          小龍:“synchronized 總的升級(jí)流程是這樣:無(wú)鎖 ----> 偏向鎖 ----> 輕量級(jí)鎖----> 鎖自旋 ----> 重量級(jí)鎖?!?/p>

          偏向鎖

          小龍:“首先會(huì)判斷Mark Word里面是否有當(dāng)前線程Id,若有則處于偏向鎖,若無(wú)則嘗試用 CAS 將 Mark Word 替換為線程Id,若成功則偏向鎖設(shè)置成功,失敗則有競(jìng)爭(zhēng)要升級(jí)成輕量級(jí)鎖?!?/p>

          輕量級(jí)鎖

          小龍:“而對(duì)于輕量級(jí)鎖里面涉及的就更復(fù)雜,詳細(xì)展開(kāi)說(shuō)就是,開(kāi)始會(huì)創(chuàng)建鎖記錄(Lock Record)對(duì)象,然后我們每個(gè)線程的棧幀都會(huì)包含一個(gè)鎖記錄的結(jié)構(gòu),內(nèi)部可以用來(lái)存儲(chǔ)鎖定對(duì)象的 Mark Word;”

          鎖記錄(Lock Record)包含了 lock record 地址 00、Object reference

          對(duì)象(Obejct)組成上面說(shuō)過(guò)了,此處不再贅述

          小龍:“然后讓鎖記錄中 Object reference 指向鎖對(duì)象,并嘗試用 CAS(原子操作)替換 Object 的 Mark Word,將 Mark Word 的值存入鎖記錄;”

          小龍:“如果 CAS 替換成功,對(duì)象頭中存儲(chǔ)了鎖記錄地址和狀態(tài)00,表示由該線程給對(duì)象加鎖;”

          面試官:“那如果失敗又是怎樣處理的呢?”

          小龍:“如果cas失敗,有兩種情況:”

          • 如果是其它線程已經(jīng)持有了該 Object 的輕量級(jí)鎖,這時(shí)表明有競(jìng)爭(zhēng),進(jìn)入鎖膨脹過(guò)程(也就是升級(jí)成重量級(jí)鎖---monitor)
          • 如果是自己執(zhí)行了 synchronized 鎖重入,那么再添加一條 Lock Record 作為重入的計(jì)數(shù)。

          同一線程對(duì)同一對(duì)象加了多次鎖--鎖重入

          小龍:“當(dāng)退出 synchronized 代碼塊(解鎖時(shí))如果有取值為 null 的鎖記錄,表示有重入,這時(shí)重置鎖記錄表示重入計(jì)數(shù)減一;”

          小龍:“當(dāng)退出 synchronized 代碼塊(解鎖時(shí))鎖記錄的值不為 null,這時(shí)使用 CAS 將 Mark Word 的值恢復(fù)給對(duì)象頭(也就是將之前鎖記錄和對(duì)象CAS替換的部分又替換回來(lái),換回原來(lái)各自的);”

          小龍:“若上面操作成功,則解鎖成功;失敗,說(shuō)明輕量級(jí)鎖進(jìn)行了鎖膨脹或已經(jīng)升級(jí)為重量級(jí)鎖,進(jìn)入重量級(jí)鎖解鎖流程。”

          重量級(jí)鎖

          面試官:“那重量級(jí)鎖又是怎么回事呢?”

          小龍:“如果在嘗試加輕量級(jí)鎖的過(guò)程中,CAS 操作無(wú)法成功,這時(shí)一種情況就是有其它線程為此對(duì)象加上了輕量級(jí)鎖(有競(jìng)爭(zhēng)),這時(shí)需要進(jìn)行鎖膨脹,將輕量級(jí)鎖變?yōu)橹亓考?jí)鎖?!?/p>

          小龍:“當(dāng) T1 進(jìn)行輕量級(jí)加鎖時(shí),T0 已經(jīng)對(duì)該對(duì)象加了輕量級(jí)鎖?!?/p>

          小龍:“這時(shí) T1 加輕量級(jí)鎖失敗,進(jìn)入鎖膨脹流程 (因?yàn)?T1 加鎖失敗,被 T0 占了,但是 T1 不能在這干耗著啊,于是進(jìn)入鎖膨脹,申請(qǐng)一個(gè)monitor 去阻塞,升級(jí)成重量級(jí)鎖--這時(shí)才有阻塞)”

          小龍:“實(shí)際上就是為 Object 對(duì)象申請(qǐng) Monitor 鎖,讓 Object 指向重量級(jí)鎖地址。然后自己進(jìn)入 Monitor 的 EntryList BLOCKED ”

          小龍:“當(dāng) T0 退出同步塊解鎖時(shí),使用 CAS 將 Mark Word 的值恢復(fù)給對(duì)象頭,失敗(因?yàn)閛bject mark-word 里放的是 monitor對(duì)象的地址了,不是T0 的 Lock Recode里面那個(gè)地址了)。這時(shí)會(huì)進(jìn)入重量級(jí)解鎖流程,即按照 Monitor 地址找到 Monitor 對(duì)象,設(shè)置 Owner為 null,喚醒 EntryList 中 BLOCKED 線程?!?/p>

          這只是為了讓大家全面詳細(xì)的了解整個(gè)鎖升級(jí)過(guò)程,其實(shí)面試不用回答那么完整,只需要簡(jiǎn)單說(shuō)一下整個(gè)流程便可以,如果面試官要深問(wèn),再細(xì)講。不過(guò)【面試筆記】全都給大家把關(guān)鍵點(diǎn)提煉出來(lái)啦,按著回答問(wèn)題不大

          面試官:“給個(gè)大大的贊,繼續(xù)加油!”

          獨(dú)白:“不愧是我,真男人是也!【面試筆記】在手,大廠 offer 不愁。

          知識(shí)總結(jié)

          本期我們通過(guò)面試模擬深入探討了 synchronized 的底層實(shí)現(xiàn)原理,下期分析 volatile相關(guān)。訂閱+星標(biāo)持續(xù)追更。

          面試重點(diǎn)

          ?synchronized?的底層實(shí)現(xiàn)原理.

          點(diǎn)擊下方“閱讀原文”直達(dá)視頻,或者B站搜索:小龍coding



          ---END---

          求一鍵三連希望轉(zhuǎn)發(fā)、在看分享給更多同學(xué)喲~

          公眾號(hào):大廠進(jìn)階指南,專(zhuān)注分享后端技術(shù)、校招面試求職

          相逢必是緣分,希望大家給個(gè)小小的關(guān)注!您的支持是我莫大的動(dòng)力,更多優(yōu)質(zhì)好文等您來(lái)探索,愛(ài)你喲
          同時(shí),我也是?B 站?up 主小龍coding,日常分享高質(zhì)量資料,輸出面試、工作經(jīng)驗(yàn)、歡迎圍
          瀏覽 126
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一本无码一区二区三区 | 欧美日在线 | 影音先锋亚洲资源 | 国产理论电影 | 韩日毛片|