開篇閑扯
打工人,打工魂,我們生而人上人。當“資本主義”逐漸禁錮我們人(大)上(韭)人(菜)肉體的時候,那一刻我才明白那個日不落帝國·資本主義收割機·瑞民族之光幸·瑞幸咖啡是多么的了不起,盡管我不懂咖啡,但還是要說一聲謝謝!說到咖啡,喝完就想上廁所,對寫bug的我來說太不友好了,畢竟我不(很)喜歡帶薪上廁所。
回歸本次的不正經Java文章。上篇文章末尾處已經提到了,主要會把我對Synchronized的理解進行一次全方位的梳理,如果能幫助到大家吊打面試官,萬分榮幸。
一面
一面就做了一道算法題,要求兩小時內完成,給了長度為N的有重復元素的數組,要求輸出第10大的數。典型的TopK問題,快排算法搞定。
算法題要注意的是合法性校驗、邊界條件以及異常的處理。另外,如果要寫測試用例,一定要保證測試覆蓋場景盡可能全。加上平時刷刷算法題,這種考核應該沒問題的。
二面
- 自我介紹下唄
- 開源項目貢獻過代碼么?(Dubbo提過一個打印accesslog的bug算么)
- 目前在部門做什么,業務簡單介紹下,內部有哪些系統,作用和交互過程說下
- Dubbo踩過哪些坑,分別是怎么解決的?(說了異常處理時業務異常捕獲的問題,自定義了一個異常攔截器)
- 開始進入正題,說下你對線程安全的理解(多線程訪問同一個對象,如果不需要考慮額外的同步,調用對象的行為就可以獲得正確的結果就是線程安全)
- 事務有哪些特性?(ACID)
- 怎么理解原子性?(同一個事務下,多個操作要么成功要么失敗,不存在部分成功或者部分失敗的情況)
- 樂觀鎖和悲觀鎖的區別?(悲觀鎖假定會發生沖突,訪問的時候都要先獲得鎖,保證同一個時刻只有線程獲得鎖,讀讀也會阻塞;樂觀鎖假設不會發生沖突,只有在提交操作的時候檢查是否有沖突)這兩種鎖在Java和MySQL分別是怎么實現的?(Java樂觀鎖通過CAS實現,悲觀鎖通過synchronize實現。mysql樂觀鎖通過MVCC,也就是版本實現,悲觀鎖可以通過select… for update加上排它鎖)
- HashMap為什么不是線程安全的?(多線程操作無并發控制,順便說了在擴容的時候多線程訪問時會造成死鎖,會形成一個環,不過擴容時多線程操作形成環的問題再JDK1.8已經解決,但多線程下使用HashMap還會有一些其他問題比如數據丟失,所以多線程下不應該使用HashMap,而應該使用ConcurrentHashMap)怎么讓HashMap變得線程安全?(Collections的synchronize方法包裝一個線程安全的Map,或者直接用ConcurrentHashMap)兩者的區別是什么?(前者直接在put和get方法加了synchronize同步,后者采用了分段鎖以及CAS支持更高的并發)
- jdk1.8對ConcurrentHashMap做了哪些優化?(插入的時候如果數組元素使用了紅黑樹,取消了分段鎖設計,synchronize替代了Lock鎖)為什么這樣優化?(避免沖突嚴重時鏈表多長,提高查詢效率,時間復雜度從O(N)提高到O(logN))
- redis主從機制了解么?怎么實現的?
- 有過GC調優的經歷么?(有點虛,答得不是很好)
- 有什么想問的么?
三面
- 簡單自我介紹下
- 監控系統怎么做的,分為哪些模塊,模塊之間怎么交互的?用的什么數據庫?(MySQL)使用什么存儲引擎,為什么使用InnnoDB?(支持事務、聚簇索引、MVCC)
- 訂單表有做拆分么,怎么拆的?(垂直拆分和水平拆分)
- 水平拆分后查詢過程描述下
- 如果落到某個分片的數據很大怎么辦?(按照某種規則,比如哈希取模、range,將單張表拆分為多張表)
- 哈希取模會有什么問題么?(有的,數據分布不均,擴容縮容相對復雜 )
- 分庫分表后怎么解決讀寫壓力?(一主多從、多主多從)
- 拆分后主鍵怎么保證惟一?(UUID、Snowflake算法)
- Snowflake生成的ID是全局遞增唯一么?(不是,只是全局唯一,單機遞增)
- 怎么實現全局遞增的唯一ID?(講了TDDL的一次取一批ID,然后再本地慢慢分配的做法)
- Mysql的索引結構說下(說了B+樹,B+樹可以對葉子結點順序查找,因為葉子結點存放了數據結點且有序)
- 主鍵索引和普通索引的區別(主鍵索引的葉子結點存放了整行記錄,普通索引的葉子結點存放了主鍵ID,查詢的時候需要做一次回表查詢)一定要回表查詢么?(不一定,當查詢的字段剛好是索引的字段或者索引的一部分,就可以不用回表,這也是索引覆蓋的原理)
- 你們系統目前的瓶頸在哪里?
- 你打算怎么優化?簡要說下你的優化思路
- 有什么想問我么?
四面
- 介紹下自己
- 為什么要做逆向?
- 怎么理解微服務?
- 服務治理怎么實現的?(說了限流、壓測、監控等模塊的實現)
- 這個不是中間件做的事么,為什么你們部門做?(當時沒有單獨的中間件團隊,微服務剛搞不久,需要進行監控和性能優化)
- 說說Spring的生命周期吧
- 說說GC的過程(說了young gc和full gc的觸發條件和回收過程以及對象創建的過程)
- CMS GC有什么問題?(并發清除算法,浮動垃圾,短暫停頓)
- 怎么避免產生浮動垃圾?(記得有個VM參數設置可以讓掃描新生代之前進行一次young gc,但是因為gc是虛擬機自動調度的,所以不保證一定執行。但是還有參數可以讓虛擬機強制執行一次young gc)
- 強制young gc會有什么問題?(STW停頓時間變長)
- 知道G1么?(了解一點 )
- 回收過程是怎么樣的?(young gc、并發階段、混合階段、full gc,說了Remember Set)
- 你提到的Remember Set底層是怎么實現的?
- 有什么想問的么?
五面
五面是HRBP面的,和我提前預約了時間,主要聊了之前在螞蟻的實習經歷、部門在做的事情、職業發展、福利待遇等。阿里面試官確實是具有一票否決權的,很看重你的價值觀是否match,一般都比較喜歡皮實的候選人。HR面一定要誠實,不要說謊,只要你說謊HR都會去證實,直接cut了。
- 之前螞蟻實習三個月怎么不留下來?
- 實習的時候主管是誰?
- 實習做了哪些事情?(尼瑪這種也問?)
- 你對技術怎么看?平時使用什么技術棧?(阿里HR真的是既當爹又當媽,)
- 最近有在研究什么東西么
- 你對SRE怎么看
- 對待遇有什么預期么
總結
談到面試,其實說白了就是刷題刷題刷題,天天作死的刷。。。。。
為了準備這個“金三銀四”的春招,狂刷一個月的題,狂補超多的漏洞知識,像這次美團面試問的算法、數據庫、Redis、設計模式等這些題目都是我刷到過的
并且我也將自己刷的題全部整理成了PDF或者Word文檔(含詳細答案解析),有需要的朋友可以戳這里即可免費領取
66個Java面試知識點
架構專題(MySQL,Java,Redis,線程,并發,設計模式,Nginx,Linux,框架,微服務等)+大廠面試題詳解(百度,阿里,騰訊,華為,迅雷,網易,中興,北京中軟等)
算法刷題(PDF)
面試題詳解(百度,阿里,騰訊,華為,迅雷,網易,中興,北京中軟等)**
[外鏈圖片轉存中…(img-5JAR76gP-1623850583781)]
算法刷題(PDF)