由String,String Builder,String Buffer 引起的面試慘案,面試套路深回答需謹慎 前言: 最後:

前言:

String,StringBuilder,StringBuffer的區別是啥?這個面試題估計每個程序員都應該碰到過吧。依稀記得第一次面試的時候,面試官問我這個問題時,心想着這不是很簡單嗎。深入瞭解這個問題後,發現這裏面並不簡單,面試官的套路還是深啊!

面試官:String,StringBuilder,StringBuffer的區別是啥?

從可變性來講String的是不可變的,StringBuilder,StringBuffer的長度是可變的。

從運行速度上來講StringBuilder > StringBuffer > String。

從線程安全上來StringBuilder是線程不安全的,而StringBuffer是線程安全的。

所以 String:適用於少量的字符串操作的情況,StringBuilder:適用於單線程下在字符緩衝區進行大量操作的情況,StringBuffer:適用多線程下在字符緩衝區進行大量操作的情況。

面試官:爲什麼String的是不可變的?

因爲存儲數據的char數組是使用final進行修飾的,所以不可變。

面試官:String類可以被繼承嘛?

不可以,因爲String類使用final關鍵字進行修飾,所以不能被繼承,並且StringBuilder,StringBuffer也是如此都被final關鍵字修飾。

面試官:爲什麼String Buffer是線程安全的?

這是因爲在StringBuffer類內,常用的方法都使用了synchronized 進行同步所以是線程安全的,然而StringBuilder並沒有。這也就是運行速度StringBuilder > StringBuffer的原因了。

面試官:剛纔你說到了synchronized關鍵字 ,那能講講synchronized的表現形式嘛?

對於普通同步方法 ,鎖是當前實例對象。

對於靜態同步方法,鎖是當前類的class對象。

對於同步方法塊,鎖是Synchonized括號配置的對象。

面試官:能講講synchronized的原理嘛?

synchronized是一個重量級鎖,實現依賴於JVM 的 monitor 監視器鎖。主要使用monitorenter和monitorexit指令來實現方法同步和代碼塊同步。在編譯的是時候,會將monitorexit指令插入到同步代碼塊的開始位置,而monitorexit插入方法結束處和異常處,並且每一個monitorexit都有一個與之對應的monitorexit。

任何對象都有一個monitor與之關聯,當一個monitor被持有後,它將被處於鎖定狀態,線程執行到monitorenter指令時間,會嘗試獲取對象所對應的monitor的所有權,即獲取獲得對象的鎖,由於在編譯期會將monitorexit插入到方法結束處和異常處,所以在方法執行完畢或者出現異常的情況會自動釋放鎖。

硬菜來了

面試官:前面你提到synchronized是個重量級鎖,那它的優化有了解嘛?

爲了減少獲得鎖和和釋放鎖帶來的性能損耗引入了偏向鎖、輕量級鎖、重量級鎖來進行優化,鎖升級的過程如下:

首先是一個無鎖的狀態,當線程進入同步代碼塊的時候,會檢查對象頭內和棧幀中的鎖記錄裏是否存入存入當前線程的ID,如果沒有使用CAS 進行替換。以後該線程進入和退出同步代碼塊不需要進行CAS 操作來加鎖和解鎖,只需要判斷對象頭的Mark word內是否存儲指向當前線程的偏向鎖。如果有表示已經獲得鎖,如果沒有或者不是,則需要使用CAS進行替換,如果設置成功則當前線程持有偏向鎖,反之將偏向鎖進行撤銷並升級爲輕量級鎖。

輕量級鎖加鎖過程,線程在執行同步塊之前,JVM會在當前線程的棧幀中創建用於存儲鎖記錄的空間,並將對象頭的Mark Word複製到鎖記錄(Displaced Mark Word)中,然後線程嘗試使用CAS 將對象頭中的Mark Word替換爲指向鎖記錄的指針。如果成功,當前線程獲得鎖,反之表示其他線程競爭鎖,當前線程便嘗試使用自旋來獲得鎖。

輕量級鎖解鎖過程,解鎖時,會使用CAS將Displaced Mark Word替換回到對象頭,如果成功,則表示競爭沒有發生,反之則表示當前鎖存在競爭鎖就會膨脹成重量級鎖。​​​

面試官:內心OS:竟然沒問倒他,看來讓他培訓是沒啥希望了,讓他回去等通知吧 。

你的水平我這邊基本瞭解了,我對你還是比較滿意的,但是我們這邊還有幾個候選人還沒面試,沒辦法直接給你答覆,你先回去等通知吧。

我:好的好的,謝謝面試官,我這邊先回去了。內心OS:好險好險,一個string差點被問倒,幸好面試前好好看了一下,不然今天就是面試慘案了。

最後:

針對最近很多人都在面試,我這邊也整理了相當多的面試專題資料,也有其他大廠的面經。希望可以幫助到大家。​​​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章