記一次阿里巴巴一面的經歷

上週在拉勾上收到一個螞蟻金服的大哥要個人簡歷,當時很驚訝,竟然有螞蟻金服的找到我,而後想都沒想就給了。mysql

受寵若驚呀,我知道本身的水平跟阿里的差距有多遠,之前一直沒用勇氣去投,連試試都不敢。此次竟然主動找過來了,當時就再想,難道阿里這麼缺人麼?仍是隻是爲了完成某些KPI,固然了,我這種想法比較幼稚。面試

沒想到的是次日竟然收到了阿里巴巴的面試邀請郵件,裏面說到會在10個工做日內進行第一次面試。算法

無論怎麼樣吧,既然面試來了,就試試吧。能面一次這種級別的技術公司,看看本身真實的差距,也是三生有幸了。從離職的這段時間也補了補JVM,基礎的數據結構算法什麼的,還有一些高頻的Java 基礎問題。sql

週一夜 8:25 接到了螞蟻大哥來的電話,果真,跟傳說中的同樣,還在上班。當時很意外,沒想到是電話面試,由於郵件中沒提到,後面回想,貌似一面基本上都是電話面試,有些朋友二面也是電面。數據庫

進入正題,下面是整個內容。順序有些不一致,我按照模塊來整理的。緩存

自我介紹

自我介紹就先介紹 多大了、畢業多久了、作了什麼些東西、最近作的什麼內容,擅長的部分呀 等等。數據結構

這裏說一下,自我介紹的內容如實說就好,不要太過於誇大,自我介紹的內容建議你們提早準備好,不要說的時候想到哪兒說到哪兒。mybatis

線程部分

一、多線程的實現方式有哪些?多線程

這個題目在一面的時候基本上都會碰到吧,繼承 Thread 類、實現Runnable 接口,最後調用 的是 start() 方法來啓動線程。架構

這裏還有個知識點是 start() 跟 run() 方法的區別和聯繫。

直接調用 start() 方法,此時線程處於一個就緒(可運行)的狀態,可是並無真正的運行。而是獲得CPU 的時間片後,開始執行 run() 方法,run() 方法裏面的是咱們的線程體。

咱們直接 運行 run() 方法,它其實就是一個普通的方法調用,在主線程中執行,是不會開啓多線程的

二、描述一些線程死鎖的狀況?

這個問題在日常項目基本上沒怎麼接觸到,可是我有過部分了解。回答的是: 兩個線程在持有本身的鎖的時候,還要去持有對方持有的鎖時,因爲別人的鎖已經被對方持有,形成彼此等待對方釋放鎖的狀況。回答得比較片面,還有一些類型的死鎖問題沒有答出來,後面直接交底了,面試官說不要緊的。

建議你們在準備這個問題的時候能說出來產生死鎖的條件、現象、解決辦法等。而後配上一些實例說明,在面試過程當中,面試官就提到說根據咱們日常遇到死鎖問題的場景實例來講。

你們能夠搜一下下面這兩個死鎖場景問題:

一、三我的 三根筷子:每一個人須要拿到身邊的兩根筷子才能開始吃飯

二、銀行轉帳問題:線程 A 從 X 帳戶向 Y 帳戶轉帳,線程 B 從帳戶 Y 向帳戶 X 轉帳,那麼就會發生死鎖。

三、項目中有沒有用過線程池 ?怎麼用的 ?

回答了咱們項目裏面有些接口須要組裝多個服務的數據進行封裝,而後返回。這裏面咱們會使用多線程去並行拉取數據,減小接口響應時間。

面試官說:「ok,那麼你有沒有看過線程池裏面的源碼呢 ?有哪幾種線程池 ?」

源碼這裏我遲疑了一下,我說不太熟,而後我說了幾種類型的線程池 newSingleThreadExecutornewFixedThreadPoolnewCachedThreadPool 可是還漏了一種 newScheduledThreadPool 沒想起來。

四、線程池的原理是什麼樣子?底層方法的參數分別是什麼意思?

回答這個問題的時候,當時我卡住了。我知道這幾個底層都是對 調用的 ThreadPoolExecutor ,可是我死活沒有想起來名字,這時候面試官提醒了一下,而後說不要緊的。

接着就問:「那你知道他的參數都有哪些嗎 ?都分別表明什麼意思嗎 ?」

我回答的是 有個 線程的個數 和 線程存活的時間,其餘的沒說上來。而後面試官說:「不要緊的」。

補充一下:線程池底層都是經過 ThreadPoolExecutor 來實現的。

  1. public ThreadPoolExecutor( int corePoolSize, 

  2. int maximumPoolSize, 

  3. long keepAliveTime, 

  4. TimeUnit unit,

  5. BlockingQueue<Runnable> workQueue, 

  6. ThreadFactory threadFactory, 

  7. RejectedExecutionHandler handler)

幾個參數的意思分別爲:

  • corePoolSize: 線程池裏最小線程數

  • maximumPoolSize:線程池裏最大線程數量,超過最大線程時候會使用 RejectedExecutionHandler

  • keepAliveTime:線程最大的存活時間,超過這個時間就會被回收

  • unit:線程最大的存活時間的單位

  • workQueue:緩存須要執行的異步任務的隊列

  • threadFactory:新建線程工廠

  • handler:拒絕策略,表示當workQueue已滿,且池中的線程數達到maximumPoolSize時,線程池拒絕添加新任務時採起的策略。DiscardPolicy:拋棄當前任務,DiscardOldestPolicy:扔掉最舊的,CallerRunsPolicy:由向線程池提交任務的線程來執行該任務,AbortPolicy:拋出 RejectedExecutionException 異常。

問到這裏,我回答的確實太有限,面試官就沒有再細問了,仍是說:「不要緊的」。

若是你這裏答出來了,那麼我認爲你還須要掌握的是,這幾種線程池在哪些狀況下使用什麼類型的,以及要注意什麼問題,很大可能面試官會繼續深挖

這裏就不給出答案了,我相信你本身去搜一下,體會會更深入些。

MyBatis 部分

五、mybatis 的 $ 與 # 的區別?

回答:他們兩均可以來傳遞參數,不過 # 能夠方式 sql 注入,而 $ 就是字符串拼接的方式處理,可能會有sql 注入的問題。

上面還有一個關鍵的點沒有答出來,那就是 #{} 在預處理時,會把參數部分用一個佔位符 ? 代替 ,變成了以下的 sql 語句:

  1. select * from user where name = ?;

而 ${} 則只是簡單的字符串拼接,在動態解析階段就直接拼接成了 最終的sql 語句:

  1. select * from user where name = 'zhouq';

六、$ 跟 # 的使用場景 ?

這個問題我沒有怎麼理解獲得,而後回答的就是 $ 在拼接表名的時候用,其餘時候傳遞參數值的時候用 #。

七、mybatis 的 dao 接口跟 xml 文件裏面的sql 是如何創建關係的?

這裏問到的時候比較蒙圈,而後回答的是:mybatis 會先解析這些xml 文件,xml 文件裏面有命名空間 (namespace),這裏能夠跟dao 創建關係,而後 xml 中的每段 sql 會有一個id 跟 dao 中的接口進行關聯。。。

而後面試官說: "若是 我有兩個這個xml 文件 都跟這個dao 創建關係了,那不是就是衝突了?",而後,我認慫了。

我上面的回答太籠統,確定是有問題的,建議你好好去了解一下mybatis 的原理。

mybatis 到這裏就沒了。

數據庫

先問的是,你日常使用得作多的是什麼數據庫,固然了,mysql 。

八、mysql 鎖機制 ?

面試官問的是,你瞭解mysql 的鎖機制麼?我就只答出來一個行鎖。而後其餘的沒想起,就認了,其餘的忘記了。

建議你去了解了解還有表鎖、頁面鎖 等等。

九、排它鎖 & 共享鎖你瞭解嗎 ?

這個地方我想了一會,說平時瞭解得很少。實時上,日常咱們的小業務系統基本上沒有用到這些,可能有用到的地方,也沒有去在乎吧。

接着,面試官說了下面這個場景題,而後讓出解決方案。

十、場景問題:在A線程處理一條數據,好比扣款,或者是更新狀態時候,其餘的線程好比 B 須要對它進行阻塞,不可以再對這條數據進行操做,包括查詢也不行,得等A 線程處理完成之後,B才能進行處理。A 跟 B 是一樣的業務代碼產生的,非不一樣的業務。要使用數據庫的鎖來實現,怎麼實現 ?

問這個問題的時候,面試官很耐心的解釋了這個場景,而後問我有沒有想起點什麼來?其實就是想考察上面的關於數據庫鎖的問題。

十一、mysql 索引是怎麼實現的?

回答的是 B+ 樹,接着面試官繼續問:「可否大體描述一下 B+ 樹的大體結構 ?」。這塊內容沒怎麼了解,直接認慫了。

緩存相關

這塊內容是我項目上寫得有使用了多級緩存的方案,而後面試官就這一塊問了下面的這些關於使用緩存可能會遇到的問題。

十二、緩存擊穿、緩存穿透 、緩存雪崩 ?

1三、熱點數據失效怎麼解決?

這兩個問題,之前好好了解過,可是沒整理成本身的東西,面試的時候也說得雲裏霧裏。

1四、先刪緩存仍是先更新數據庫,爲何?

這裏我說的:是先刪緩存,而後再更新數據庫這是錯誤的,這裏有很是大的問題。

想一想這樣一個場景:

若是一個線程 A 先把緩存刪除了,而後去更新數據庫,那麼在它刪了緩存尚未更新到數據庫的這個中間時間,線程B進來了,發現緩存沒有,就去讀庫,這時候仍是讀取仍是舊的數據,而後又更新到緩存去了。此時A 才把新數據寫到數據庫。

此時就產生了一個典型的問題就是「雙寫不一致」。

關於這塊問題的討論:《緩存更新的套路》-陳皓老師

kafka

1五、kafka 的架構,包含了哪些角色?

這個問題我開始不知道怎麼回答,就說了個 Broker,而後面試官提醒了一下:「不是咱們日常還有生產者,消費呀什麼的嗎 ?」額,我說還有生產者、消費者、主題呀等等。

這過程當中面試官還提到說日常咱們在搭建的時候要配置寫什麼東西呀等等,按照官網的介紹說也行。

這裏還有其餘的好比Partition、消費者組、還有一個主要的 就是 zk 了。

這裏建議你們好好的把 kafka 裏面的這些概念、屬於、架構圖好好本身畫一下。否則真是關鍵時候真說不出來,可是他一提你又明白。這樣子確定是不行的,面試是你說,不是面試官說。

1六、kafka 的最小工做單元?

這個問題問得也是蒙圈,其實就是說咱們在寫代碼的時候,要用kafka的時候。咱們須要使用那些最基礎的組件,好比生產者、消費者、主題、偏移量 等等。

這個問題若是大家遇到,最好向面試官問清楚。

1七、kafka 消息重複消費的問題?冪等怎麼作的?

剛開始面試官說,你知道kafka 消息重複的問題嗎?有沒遇到。

我回答的是,會存在消息重複消費的問題。咱們在消費數據這端作了冪等處理來解決。

而後面試官繼續才問的是:冪等怎麼來作的, 我說經過設置數據版本號,還有數據庫惟一索引等等。

面試官:「ok」。

這個問題,若是你能告訴面試官產生重複消費的狀況,好比說投遞的時候重複了,消費的時候因爲 offset 沒處理好等等問題致使的話,我想可能會更好。

1八、kafka ack 機制?集羣中的ack 是怎麼實現的?

這裏我只回答上了 ack 機制是啥,可是實現原理沒有回答上來。

Redis

1九、Redis 中有哪些數據結構

日常使用得最多的是 String , 還有 List 、Hash、Set、ZSet 。

沒有再問其餘的內容。

可是像Redis 爲何這麼快這種問題,我認爲你應該要去了解,其餘小夥伴常常遇到。也就是多路複用是個什麼玩意兒?

源碼

20、這裏面試官問 你日常有沒有看過一些源碼?框架的也行?JDK 的也行。

而後我說看了 HashMap 的源碼,而後就巴拉巴拉的說了一哈大致的 put、get 流程 ,它的結構是什麼樣子的。

這過程當中還問到了 怎麼判斷兩個對象是否相等?也就是 == 和 equals 的知識點。

其餘的就沒再繼續問了。到這裏整個電面過程結束了,說10個工做日內會給我答覆這次面試狀況。整個過程大概持續了40分鐘的樣子。

我知道,涼涼。

最後總結一下

上面的模塊雖然順序有變化,可是每一個大塊裏面的問題都是按照順序來的,基本上都是由淺入深、按部就班的來問。

像數據庫鎖、線程池、緩存問題 這些內容幾乎都是那種連環炮的形式,直到摸到你的底

經過此次面試,親身體會到了差距。不過,更有方向了。

告誡你們一點東西:

  • 日常多積累輸出:輸出或者教會別人是最好的學習方式,光看不練,幾天就忘。

  • 先深後廣:深刻學習,而不是隻停留在使用API 的層面,一塊一塊系統的深刻了解,再去搞其餘的。

  • 創建知識體系:把本身學習的內容造成博客也好,什麼導圖也罷,記得把這些零散的內容,整理成本身的知識。

  • 別抱有僥倖心理:別裸面,若是本身有整理的仍是多看一下,多準備準備。大廠的面試會挖到你最深的部分,不要以爲只背一些面試題就是 ok的,題是背不完的。臨時抱佛腳基本上過不了關。若是你是靠背面試題進去的,那麼你厲害,佩服。

  • 隔一段時間就去面試吧:不要學我,待一家公司三年多,中途都沒有出去面過,出去面面才知道,哪些是須要去補充的。

有些問題可能答案這些不是太全面,須要你本身去動手。

但願這篇文章對你有幫助,哪怕只有一個點,都是值得的。若是其中有一些點你不瞭解,那麼你是時候要去補充了。

別在本身的溫馨區待過久,否則出不來。出來混,早晚是要還的!

 

精彩回顧:

面試點:Java 中 hashCode() 和 equals() 的關係

容器鏈接[Docker 系列-7]

現現在的技術浪潮中,咱們到底該作些什麼?

 

強烈推薦:

《Java 極客技術》知識星球限時優惠,如今加入只需 50 元,僅限前 1000 名,機不可失時再也不來。趁早行動吧!

https://t.zsxq.com/J6Em2nU

 

隆重介紹:

Java 極客技術公衆號,是由一羣熱愛 Java 開發的技術人組建成立,專一分享原創、高質量的 Java 文章。若是您以爲咱們的文章還不錯,請幫忙讚揚、在看、轉發支持,鼓勵咱們分享出更好的文章。

關注公衆號,你們能夠在公衆號後臺回覆「博客園」,免費得到做者 Java 知識體系/面試必看資料。 

相關文章
相關標籤/搜索