前言:
String,StringBuilder,StringBuffer的區別是啥?這個面試題估計每個程式員都應該碰到過吧,依稀記得第一次面試的時候,面試官問我這個問題時,心想著這不是很簡單嗎,深入了解這個問題后,發現這里面并不簡單,面試官的套路還是深啊!

面試官:String,StringBuilder,StringBuffer的區別是啥?
- 從可變性來講String的是不可變的,StringBuilder,StringBuffer的長度是可變的,
- 從運行速度上來講StringBuilder > StringBuffer > String,
- 從執行緒安全上來StringBuilder是執行緒不安全的,而StringBuffer是執行緒安全的,
所以 String:適用于少量的字串操作的情況,StringBuilder:適用于單執行緒下在字符緩沖區進行大量操作的情況,StringBuffer:適用多執行緒下在字符緩沖區進行大量操作的情況,
另外本人整理了20年面試題大全,包含spring、并發、資料庫、Redis、分布式、dubbo、JVM、微服務等方面總結,下圖是部分截圖,需要的話點這里點這里,暗號CSDN,

面試官:為什么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差點被問倒,幸好面試前好好看了一下,不然今天就是面試慘案了,

最后:
針對最近很多人都在面試,我這邊也整理了相當多的面試專題資料,也有其他大廠的面經,希望可以幫助到大家,
下面的面試題答案都整理成檔案筆記,也還整理了一些面試資料&最新2020收集的一些大廠的面試真題(都整理成檔案,小部分截圖),有需要的可以點擊進入暗號CSDN


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/184860.html
標籤:其他
