看看,我如何在面試官前吹牛P

你好,我是 yes。java

這篇文章我想談談如何在面試官前面吹牛P。web

我給了六個案例,教你如何把 B 格提上去。面試

這篇文章的靈感來自於一個讀者,他在羣裏@了我。算法

我一看,確實啊!緩存

首先 「幾個 offer」 說明關於 Synchronized 的面試題很常見。安全

而後從 「面試官和我爭」 能夠看出,確實不少人的理解是錯的。微信

而後你再從 JVM 源碼層面和他說說,這面試不就妥了?網絡

若是我是面試官,這候選人透露出來他看過 JVM 代碼,而且還發現了書上的錯誤,說的有理有據的,這 level 不就上來了?併發

這面試不就穩了?app

就是這篇關於Synchronized的一個點

提高 B 格的時候到了。

想一想看,當面試官問你看過什麼源碼呀

你答:我看過 JVM 關於 Synchronized 的源碼,我發現網上有好多理解都是錯誤的...阿巴阿巴。

安逸得慘咯!

這麼一想,我發現我寫過的文章還有好多能夠裝23的地方!

好比這篇:從Dubbo源碼到CPU分支預測之旅

面試官問:看過 Dubbo 源碼嘛?

你答:看過,我以前看源碼的時候還發現了一個很奇怪的地方,有個地方 if 和 switch結合着用。

我就很奇怪,因此我就用 benchmark 跑了跑,試了試  if 和 switch 的執行效率。

我發現全 if 的效率是最高的。

因而我又反編譯了代碼。

我發現 switch 是經過查表直接拿索引去訪問的,而 if 是每次都會取出變量和條件進行比較。

那不是應該  switch 的效率最佳嗎?

帶着疑問的我繼續查閱資料,後來我發現原來是 CPU 分支預測(詳細看上面文章)搞得鬼,因此 Dubbo 的源碼纔會這樣寫。

你看,這一波下來,你這表現滿分啊

會主動看源碼!

會用示例跑(動手)。

會反編譯比較,鑽研(動手)。

最後到底層 CPU(6666)。

這一套下來?面試官不要你要誰?

再好比這篇:炸了!一口氣問了我18個JVM問題!

面試官:你平時看什麼書呀

你答:我看過《深刻理解Java虛擬機》,我還發現了一個錯誤呢。

面試官:什麼錯誤呀?

你答:不是由於「Con-current Mode Failure」而致使 Full GC ,而是由於發生了 Full GC 因此拋這個錯。

我當時好奇看了看 CMS 的源碼,我發現.....

後續不貼了,以前的文章寫的很清楚了,也是從源碼上找證據

面試官一聽,這小夥子看書就算了,由於想鑽研還去看源碼,源碼不只看進去了還看出錯誤?

不只熱愛學習還有鑽研精神,我要給他發 offer!!!!

再好比這篇:Kafka索引設計與二分查詢與底層緩存

面試官:你看過 Kafka 源碼嘛

你答:看過。

當時看到了 Kafka 索引的設計,採用了稀疏索引,利用二分查找來加快搜索速度。

可是我從源碼發現這個二分查找是變型的,由於就消息隊列的特性而言,索引數據都是在文件末尾追加的寫入的,而且寫入的數據基本上會立馬被讀取。

也就是說數據熱點集中在尾部,而操做系統又是根據LRU來管理內存頁的,因此標準的二分會致使缺頁中斷的狀況發生。

因此 Kafka 巧妙的採用了冷熱分區來實現變型的二分查找

你看看,這一波下來,面試官大拇指不給你給誰?

看過源碼, 懂得基本算法,理解消息隊列尾部熱點特性,曉得操做系統LRU來淘汰內存頁,嘖嘖!

面試官對你說:

再好比這篇:ConcurrentBag 聽過沒?好傢伙高併發知識點十分密集!

面試官:讓你設計一個鏈接池你怎麼設計

你答:我以前看過 HikariCP 的源碼。

重點就是無鎖設計,由於鏈接池是讀多寫少的場景,因此能夠利用 CopyOnWriteArrayList 來存儲鏈接,而後再利用本地化存儲的思想來減小競爭。

獲取鏈接的流程:

  1. 先去 ThreadLocal 找以前用過的鏈接,找到則直接返回。
  2. 若是找不到就去 CopyOnWriteArrayList 實現的  sharedList 裏面找鏈接(這裏還有個竊取的概念),若是找到則返回。
  3. 若是找不到則用 SynchronousQueue 等待鏈接,超時則返回 null。

再詳細就看上面文章吧。

怎麼說?

通常的回答,估計也就會說個加鎖保證線程安全。

好點的,說個讀多寫少場景,用個寫時複製。

你這波無鎖+寫時複製+本地資源加速緩存+SynchronousQueue 無緩存等待隊列。

若是你以爲還不夠細,那就再說說 HikariCP 的 FastList,它優化了 ArrayList。

ArrayList 每次 get 都會有範圍檢查,而且 remove 是從前日後遍歷的。

而在鏈接池這個場景每次 get 範圍檢查沒有必要,而且 remove 的時候從後往前遍歷更好。

夠不夠細?

我細到 ArrayList 的 get 的範圍檢查我都要計較!(HikariCP 不愧是最快的)

面試官可能在角落裏瑟瑟發抖。

再好比這個:RPC 核心,萬變不離其宗

面試官:讓你設計一個RPC框架你怎麼設計

你答:容我想一想(僞裝思考,其實小宇宙就快忍不住爆發了)。

RPC 框架基礎的核心其實就這麼幾點:

  • 動態代理(屏蔽底層調用細節)
  • 序列化(網絡數據傳輸須要扁平的數據)
  • 協議(規定協議,才能識別數據)
  • 網絡傳輸(I/O模型BB一下,通常用 Netty 做爲底層通訊框架便可)

注意,上面加粗的其實二字,必定要說,要注意語氣,要顯得你遊刃有餘,低調奢華。

固然上面只是基礎核心,生產級別須要註冊中心做爲服務的發現、路由分組、負載均衡、異常重試、限流熔斷等。

更詳細的就看上面的文章吧~

面試官已經躲在角落裏瑟瑟發抖了。

再好比.....

好比不了了,太多了!

不信你去翻翻看!

我寫這篇文章的時候,我發現電腦屏幕居然愈來愈高。

原來,是我慢慢地從椅子上滑了下去....

我怕我再舉幾個例子,我要給本身跪下了。

我時常會看看本身寫的文章。

而後,默默在內心念叨這傢伙真滴牛P。

因此不要錯過個人文章喲,可能每一篇都是裝23的機會。

由於微信推送機制,文章可能沒法及時送達,因此加個星標,文章必會及時推送~。

唉,再這樣下去,我怕和半佛老師同樣,成爲一個天天在鏡子面前給本身磕頭的硬核男人。


我是 yes,從一點點到億點點,咱們下篇見

本文分享自微信公衆號 - yes的練級攻略(yes_java)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索