【面試官】你先說(shuō)說(shuō)synchronized的實(shí)現(xiàn)原理
- 面試官:知道可重入鎖有哪些嗎?
- 面試官:你先說(shuō)說(shuō)synchronized的實(shí)現(xiàn)原理?
- 面試官:那synchronized有什么缺點(diǎn)?
- 面試官:為什么上下文切換要保存當(dāng)前線程狀態(tài)?
- 面試官:可以怎么解決synchronized資源消耗嗎?
- 面試官:那它們都有什么優(yōu)缺點(diǎn)?
大家好,我是南哥。
一個(gè)Java學(xué)習(xí)與進(jìn)階的領(lǐng)路人,跟著南哥我們一起Java成長(zhǎng)。
文章目錄
- 可重入鎖
- synchronized實(shí)現(xiàn)原理
- synchronized缺點(diǎn)
- 保存線程狀態(tài)
- 鎖升級(jí)
- 鎖升級(jí)優(yōu)缺點(diǎn)
1. 可重入鎖
面試官:知道可重入鎖有哪些嗎?
可重入意味著獲取鎖的粒度是線程而不是調(diào)用,如果大家知道這個(gè)概念,會(huì)更容易理解可重入鎖的作用。
既然獲取鎖的粒度是線程,意味著線程自己是可以獲取自己的內(nèi)部鎖的,而如果獲取鎖的粒度是調(diào)用則每次經(jīng)過(guò)同步代碼塊都需要重新獲取鎖。
舉個(gè)例子。線程A獲取了某個(gè)對(duì)象鎖,但在線程代碼的流程中仍需再次獲取該對(duì)象鎖,此時(shí)線程A可以繼續(xù)執(zhí)行不需要重新再獲取該對(duì)象鎖。另外線程如果要使用父類(lèi)的同步方法,由于可重入鎖也無(wú)需再次獲取鎖。
在Java中,可重入鎖主要有ReentrantLock、synchronized。
2. synchronized實(shí)現(xiàn)原理
面試官:你先說(shuō)說(shuō)synchronized的實(shí)現(xiàn)原理?
synchronized的實(shí)現(xiàn)是基于monitor的。任何對(duì)象都有一個(gè)monitor與之關(guān)聯(lián),當(dāng)monitor被持有后,對(duì)象就會(huì)處于鎖定狀態(tài)。而在同步代碼塊的開(kāi)始位置,在編譯期間會(huì)被插入monitorenter指令。
當(dāng)線程執(zhí)行到monitorenter指令時(shí),就會(huì)嘗試獲取monitor的所有權(quán),如果獲取得到則代表獲得鎖資源。
2.1 synchronized缺點(diǎn)
面試官:那synchronized有什么缺點(diǎn)?
在Java SE 1.6還沒(méi)有對(duì)synchronized進(jìn)行了各種優(yōu)化前,很多人都會(huì)稱(chēng)synchronized為重量,因?yàn)樗鼘?duì)資源消耗是比較大的。
剩余60%內(nèi)容,訂閱專(zhuān)欄后可繼續(xù)查看/也可單篇購(gòu)買(mǎi)
??以面試官面試的形式,涵蓋了你怒懟大廠面試官、拿下大廠面試所需掌握的核心知識(shí)、面試重點(diǎn)! ??相信一定對(duì)你順利通關(guān)面試、拿到理想Offer有所幫助! ??花費(fèi)大量精力去制作本專(zhuān)欄,創(chuàng)作不易,各位的支持就是我創(chuàng)作的最大動(dòng)力!