一位資深Java的阿里系公司實戰面試經驗,套路仍是面試官的多

馬老師說過,員工的離職緣由不少,只有兩點最真實:java

  1. 錢,沒給到位
  2. 心,受委屈了

如下是佔小狼的一些實戰面試經驗分享,但願能幫助大家順利拿到理想Offer!面試

項目經驗

面試官在一開始會讓你進行自我介紹,主要是想讓你介紹一下本身作過的一些項目,看看你對這些項目的瞭解程度。安全

由於不少人簡歷上寫的項目並不是都是從頭至尾都參與的,有些只是參與並實現了其中的一些模塊而已,或是接手維護別人的項目,因此在你簡歷上所寫的和麪試過程當中所說的項目經驗,你本身必須可以瞭解前因後果。以後,面試官也會根據你的項目描述,對項目中的實現原理,或爲何要這樣實現進行提問,若是你木訥住,不知如何做答,只會大大下降面試分。數據結構

面試場景:

面試官:(拿着簡歷)講講你最近作的這個項目多線程

:&……%¥#*&¥@%¥!,說了一大通架構

PS:不知道面試官聽進去多少,面試官會挑他熟知的知識點進行提問。併發

面試官:你說這個項目中用到了netty,能大概講講netty的線程模型麼?socket

:(幸虧我看過netty的源碼)netty經過Reactor模型基於多路複用器接收並處理用戶請求(能講就多講一點),內部實現了兩個線程池,boss線程池和work線程池,其中boss線程池的線程負責處理請求的accept事件,當接收到accept事件的請求時,把對應的socket封裝到一個NioSocketChannel中,並交給work線程池,其中work線程池負責請求的read和write事件。函數

PS:經過口述加畫圖的方式,把請求的執行過程大概描述了一遍,時間有限,也不可能把全部的細節都說完,挑重點講,挑記憶深入的講。性能

面試官:嗯,理解的還挺深刻的...那你在作這個項目時有沒有遇到什麼困難,或者是以爲有挑戰的地方?

:由於以前確實碰到了這個問題,當時作這個項目時,對netty的不過熟悉,把請求的業務邏輯放在work線程池的線程中進行處理,進行壓測的時候,發現qps老是上不去,後來看了源碼以後才發現,因爲業務邏輯的處理比較耗時,徹底佔用了work線程池的資源,致使新的請求一直處於等待狀態。

PS:這時面試官想讓你本身出題本身回答了,因此必定要回答,不回答就突顯不出你這個項目了,要是這個問題沒有準備過,只能臨時發揮了,固然我就是屬於臨時發揮的

面試官:那最後是如何解決的?

:最後把處理業務的邏輯封裝成一個task提交給一個新建的業務線程池中執行,執行完以後由work線程池執行請求的write事件。

面試官:好的,你知道nio中selector可能觸發bug麼?

:嗯,對的,selector的select方法,由於底層的epoll函數可能會發生空轉,從而致使cpu100%。

面試官:那如何解決該問題?

:這個問題在netty已經解決了,經過&^%&$^(把netty的解決方案說一遍)

面試官:嗯,對了,大家這個項目有給本身定指標麼?

:有的……把本身項目的指標說了一通,如何進行AB實驗,如何迭代優化指標

面試官:嗯,好的 ,項目的問題先到這裏,咱們來考察一下java的基本點吧。>

如上只是本人所作的一個項目,固然了,具體項目具體分析,也不是每一個面試官問的點都同樣。若是面試官不懂netty,天然會挑別的問題進行提問,不過儘可能嘗試着把問題往本身熟悉的方向去靠。

面試知識點一、線程池

線程池的實現原理,這個知識點真的很重要,幾乎每次面試都會被問到,通常的提問方式有以下幾種:

  1. 「講講線程池的實現原理」
  2. 「線程池中的coreNum和maxNum有什麼不一樣」
  3. 「在不一樣的業務場景中,線程池參數如何設置」

面試場景:

面試官:平時線程池用的多麼?

:嗯,個人*項目中就用到了。

面試官:那好,你講講線程池的實現原理

:能給我筆和紙麼,我畫圖分析給你看看,……假設初始化一個線程池,核心線程數是5,最大線程數是……

面試官:嗯,好的,你繼續...

:在紙上畫了正方形,這個表明一個線程池,初始化的時候,裏面是沒有線程的

面試官:嗯,好的,你繼續...

:又畫了一個細長的長方形,這個表明阻塞隊列,一開始裏面也是沒有任務的。當來了一個任務時,在正方形中畫了一個小圓圈,表明初始化了一個線程,若是再來一個任務,就再畫一個圓圈,表示再初始化了一個線程,連續畫了5個圓圈以後,若是第6個任務過來了...

面試官:嗯,好的,你繼續...

:這時會把第6個任務放到阻塞隊列中..

面試官:嗯,而後呢?

:如今線程池中不是有5個線程了麼,若是其中一個線程空閒了,就會從阻塞隊列中獲取第6個任務,進行執行..

面試官:嗯,對的,那若是任務產生的速度比消費的速度快呢?

:若是線程池的5個線程都在running狀態,那麼任務就先保存在阻塞隊列中

面試官:若是隊列滿了,怎麼辦?

:若是隊列滿了,咱們不是設置了最大線程數是10麼,而線程池中只有5個線程,這時會新建一個線程去執行不能保存到阻塞隊列的任務,而後我又在正方形中畫了5個圓圈。

面試官:那若是線程池中的線程數達到10個了,阻塞隊列也滿了,怎麼辦?

:這種狀況經過自定義reject函數去處理這裏任務了,舒了一口去,覺得問完了...

面試官:好的,那若是運行一段時間以後,阻塞隊列中的任務也執行完了,線程池中的線程會怎麼樣?

:...這個好像超過核心線程數的線程會在空閒一段時間內自動回收...由於有點不記得這個邏輯了,回答的有點虛...

面試官:好的,那這種狀況在什麼場景下會發生?

:這個...那個...我好像沒有遇到過這樣的狀況……

面試官:嗯,好的,你回去以後再好好想一想。

:........

PS:面試真的會緊張,致使不少明明知道的東西卻全忘記了。因此必定要放鬆放鬆。並且有蠻多面試官其實會很耐心,會引導你,但也會沿着你的思路一直細問下去,因此必定要確保本身思惟邏輯清晰。

我竟然忘記了「秒殺」這個場景!

鎖的實現

在關於鎖的面試過程當中,通常主要問Synchronized和ReentrantLock的實現原理,更有甚者會問讀寫鎖。

面試場景

面試官:都瞭解Java中的什麼鎖?

:好比Synchronized和ReentrantLock...讀寫鎖用的很少,就沒研究了。

PS:我就怕被問讀寫鎖,由於一直沒去看。因此,對一些本身不瞭解的話題,儘可能少說一點,也坦白認可本身不會。

面試官:那好,你先說說Synchronized的實現原理吧。

:嗯,Synchronized是JVM實現的一種鎖,其中鎖的獲取和釋放分別是monitorenter和monitorexit指令,該鎖在實現上分爲了偏向鎖、輕量級鎖和重量級鎖,其中偏向鎖在1.6是默認開啓的,輕量級鎖在多線程競爭的狀況下會膨脹成重量級鎖,有關鎖的數據都保存在對象頭中……

面試官:哦,嗯,理解的還挺透徹,那你說說ReentrantLock的實現吧...

:ReentrantLock是基於AQS實現的

面試官:什麼是AQS?

:在AQS內部會保存一個狀態變量state,經過CAS修改該變量的值,修改爲功的線程表示獲取到該鎖,沒有修改爲功,或者發現狀態state已是加鎖狀態,則經過一個Waiter對象封裝線程,添加到等待隊列中,並掛起等待被喚醒……

面試官:能說說CAS的實現原理麼?

:CAS是經過unsafe類的compareAndSwap方法實現的(內心得意的一笑)

面試官:哦,好的,那你知道這個方法的參數的含義的麼?

:這個方法看的時間有點久遠了,第一個參數是要修改的對象,第二個參數是對象中要修改變量的偏移量,第三個參數是修改以前的值,第四個參數是預想修改後的值....

面試官:嗯,對的,那你知道操做系統級別是如何實現的麼?

:(我去你大爺...)我只記得X86中有一個cmp開頭的指令,具體的我忘記了...

面試官:嗯,好,你知道CAS指令有什麼缺點麼

:哦,CAS的缺點是存在ABA問題。

面試官:怎麼講?

:就是一個變量V,若是變量V初次讀取的時候是A,而且在準備賦值的時候檢查到它仍然是A,那能說明它的值沒有被其餘線程修改過了嗎?若是在這段期間它的值曾經被改爲了B,而後又改回A,那CAS操做就會誤認爲它歷來沒有被修改過。

面試官:那怎麼解決?

:(有完沒完了啊...個人內心是崩潰的)針對這種狀況,java併發包中提供了一個帶有標記的原子引用類"AtomicStampedReference",它能夠經過控制變量值的版原本保證CAS的正確性。

面試官:嗯,好的,這個問題到此爲止,咱們再看看別的。 我:....我能喝口水麼

ConcurrentHashMap

當考察數據結構時,面試官一開始會問HashMap的實現原理,當你說出HashMap並不是線程安全以後,會讓你本身引出ConcurrentHashMap,接着就可能開始以下的對話。

面試場景

面試官:談談ConcurrentHashMap實現原理

:……基於分段鎖的……,可是1.8以後改變實現方式了。

面試官:1.8啥方式?

:……(把1.8的實現原理說了一通,其中提到了紅黑樹)...

面試官:能講下紅黑樹的概念嗎?

:紅黑樹是一種二叉樹,而且是平衡……%……¥……,

面試官:能講下紅黑樹的……

:打住,別問了,紅黑樹我只知道他是二叉樹,比其餘樹多一個屬性,其餘的我都不知道。 面試官:好的,那換個,你知道它的size方法是如何實現的麼?

:size方法?是想要獲得Map中的元素個數麼?

面試官:對的....

:我記得好像size方法返回是不許確的,平時也不會用到這個方法...

面試官:若是你以爲size方法返回值不許確,那若是讓你本身實現,你以爲應該怎麼實現呢?

:(兩眼一黑)等等,讓我想一想.....應該能夠用AtomicInteger變量進行記錄...嗯,對的,每次插入或刪除的時候,操做這個變量,我得意的一笑...

面試官:哦,是麼,那若是我以爲這個AtomicInteger這個變量性能很差,還能再優化麼?

:懵逼臉...(當時竟然把volitile變量給忘記了)...好像沒有了,我想不出來了...

面試官:哦,那回頭你再看看源碼吧,jdk中已經實現了...

:哦,是麼....

面試官:那今天的面試到此結束,咱們後面會通知你。

:……(結束專業用語)

寫在最後

點關注,不迷路;持續更新Java架構相關技術及資訊熱文!!!

相關文章
相關標籤/搜索