
記一次阿里巴巴一面經歷,作為一名java程式員終于找到了自己差距
面試前的故事
上周在拉勾上收到一個螞蟻金服的大哥要我的簡歷,當時很驚訝,居然有螞蟻金服的找到我,然后想都沒想就給了,
受寵若驚呀,我知道自己的水平跟阿里的差距有多遠,以前一直沒用勇氣去投,連試試都不敢,這次居然主動找過來了,當時就再想,難道阿里這么缺人么?還是只是為了完成某些KPI,當然了,我這種想法比較幼稚,
沒想到的是第二天居然收到了阿里巴巴的面試邀請郵件,里面說到會在10個作業日內進行第一次面試,
不管怎么樣吧,既然面試來了,就試試吧,能面一次這種級別的技術公司,看看自己真實的差距,也是三生有幸了,從離職的這段時間也補了補JVM,基礎的資料結構演算法什么的,還有一些高頻的Java 基礎問題,
周一晚上 8:25 接到了螞蟻大哥來的電話,果然,跟傳說中的一樣,還在上班,當時很意外,沒想到是電話面試,因為郵件中沒提到,后面回想,貌似一面基本上都是電話面試,有些朋友二面也是電面,
進入正題,下面是整個內容,順序有些不一致,我按照模塊來整理的,

記一次阿里巴巴一面經歷,作為一名java程式員終于找到了自己差距
自我介紹
自我介紹就先介紹 多大了、畢業多久了、做了什么些東西、最近做的什么內容,擅長的部分呀 等等,
這里說一下,自我介紹的內容如實說就好,不要太過于夸大,自我介紹的內容建議大家提前準備好,不要說的時候想到哪兒說到哪兒,
執行緒部分
1、多執行緒的實作方式有哪些?
這個題目在一面的時候基本上都會碰到吧,繼承 Thread 類、實作Runnable 介面,最后呼叫 的是 start() 方法來啟動執行緒,
這里還有個知識點是 start() 跟 run() 方法的區別和聯系,
直接呼叫 start() 方法,此時執行緒處于一個就緒(可運行)的狀態,但是并沒有真正的運行,而是得到CPU 的時間片后,開始執行 run() 方法,run() 方法里面的是我們的執行緒體,
我們直接 運行 run() 方法,它其實就是一個普通的方法呼叫,在主執行緒中執行,是不會開啟多執行緒的,
2、描述一些執行緒死鎖的情況?
這個問題在平常專案基本上沒怎么接觸到,但是我有過部分了解,回答的是: 兩個執行緒在持有自己的鎖的時候,還要去持有對方持有的鎖時,由于別人的鎖已經被對方持有,造成彼此等待對方釋放鎖的情況,回答得比較片面,還有一些型別的死鎖問題沒有答出來,后面直接交底了,面試官說沒關系的,
建議大家在準備這個問題的時候能說出來產生死鎖的條件、現象、解決辦法等,然后配上一些實體說明,在面試程序中,面試官就提到說根據我們平常遇到死鎖問題的場景實體來說,
大家可以搜一下下面這兩個死鎖場景問題:
- 三個人 三根筷子:每個人需要拿到身邊的兩根筷子才能開始吃飯
- 銀行轉賬問題:執行緒 A 從 X 賬戶向 Y 賬戶轉賬,執行緒 B 從賬戶 Y 向賬戶 X 轉賬,那么就會發生死鎖,
3、專案中有沒有用過執行緒池 ?怎么用的 ?
回答了我們專案里面有些介面需要組裝多個服務的資料進行封裝,然后回傳,這里面我們會使用多執行緒去并行拉取資料,減少介面回應時間,
面試官說:“ok,那么你有沒有看過執行緒池里面的原始碼呢 ?有哪幾種執行緒池 ?”
原始碼這里我遲疑了一下,我說不太熟,然后我說了幾種型別的執行緒池 newSingleThreadExecutor、newFixedThreadPool、newCachedThreadPool但是還漏了一種 newScheduledThreadPool 沒想起來,
4、執行緒池的原理是什么樣子?底層方法的引數分別是什么意思?
回答這個問題的時候,當時我卡住了,我知道這幾個底層都是對 呼叫的 ThreadPoolExecutor ,但是我死活沒有想起來名字,這時候面試官提醒了一下,然后說沒關系的,
接著就問:“那你知道他的引數都有哪些嗎 ?都分別代表什么意思嗎 ?”
我回答的是 有個 執行緒的個數 和 執行緒存活的時間,其他的沒說上來,然后面試官說:“沒關系的”,
補充一下:執行緒池底層都是通過 ThreadPoolExecutor 來實作的,

記一次阿里巴巴一面經歷,作為一名java程式員終于找到了自己差距
幾個引數的意思分別為:
- corePoolSize: 執行緒池里最小執行緒數
- maximumPoolSize:執行緒池里最大執行緒數量,超過最大執行緒時候會使用 RejectedExecutionHandler
- keepAliveTime:執行緒最大的存活時間,超過這個時間就會被回收
- unit:執行緒最大的存活時間的單位
- workQueue:快取需要執行的異步任務的佇列
- threadFactory:新建執行緒工廠
- handler拒絕策略,表示當workQueue已滿,且池中的執行緒數達到maximumPoolSize時,執行緒池拒絕添加新任務時采取的策略,DiscardPolicy:拋棄當前任務,DiscardOldestPolicy:扔掉最舊的,CallerRunsPolicy:由向執行緒池提交任務的執行緒來執行該任務,AbortPolicy:拋出 RejectedExecutionException 例外,
問到這里,我回答的確實太有限,面試官就沒有再細問了,還是說:“沒關系的”,
如果你這里答出來了,那么我認為你還需要掌握的是,這幾種執行緒池在哪些情況下使用什么型別的,以及要注意什么問題,很大可能面試官會繼續深挖,
這里就不給出答案了,我相信你自己去搜一下,體會會更深刻些,
MyBatis 部分

記一次阿里巴巴一面經歷,作為一名java程式員終于找到了自己差距
需要清晰系統圖的文末領取
5、mybatis 的 $ 與 # 的區別?
回答:他們兩都可以來傳遞引數,不過 # 可以方式 sql 注入,而 $ 就是字串拼接的方式處理,可能會有sql 注入的問題,
上面還有一個關鍵的點沒有答出來,那就是 #{} 在預處理時,會把引數部分用一個占位符 ? 代替 ,變成了如下的 sql 陳述句:
- select * from user where name = ?;
- 而 ${} 則只是簡單的字串拼接,在動態決議階段就直接拼接成了 最終的sql 陳述句:select * from user where name = 'zhouq';
6、$ 跟 # 的使用場景 ?
這個問題我沒有怎么理解得到,然后回答的就是 $ 在拼接表名的時候用,其他時候傳遞引數值的時候用 #,
7、mybatis 的 dao 介面跟 xml 檔案里面的sql 是如何建立關系的?
這里問到的時候比較蒙圈,然后回答的是:mybatis 會先決議這些xml 檔案,xml 檔案里面有命名空間 (namespace),這里可以跟dao 建立關系,然后 xml 中的每段 sql 會有一個id 跟 dao 中的介面進行關聯,,,
然后面試官說: "如果 我有兩個這個xml 檔案 都跟這個dao 建立關系了,那不是就是沖突了?",然后,我認慫了,
我上面的回答太籠統,肯定是有問題的,建議你好好去了解一下mybatis 的原理,
mybatis 到這里就沒了,
資料庫
先問的是,你平常使用得做多的是什么資料庫,當然了,mysql ,
8、mysql 鎖機制 ?

記一次阿里巴巴一面經歷,作為一名java程式員終于找到了自己差距
需要清晰系統圖的文末領取
面試官問的是,你了解mysql 的鎖機制么?我就只答出來一個行鎖,然后其他的沒想起,就認了,其他的忘記了,
建議你去了解了解還有表鎖、頁面鎖 等等,
9、排它鎖 & 共享鎖你了解嗎 ?
這個地方我想了一會,說平時了解得不多,實時上,平常我們的小業務系統基本上沒有用到這些,可能有用到的地方,也沒有去在意吧,
接著,面試官說了下面這個場景題,然后讓出解決方案,
10、場景問題:在A執行緒處理一條資料,比如扣款,或者是更新狀態時候,其他的執行緒比如 B 需要對它進行阻塞,不能夠再對這條資料進行操作,包括查詢也不行,得等A 執行緒處理完成以后,B才能進行處理,A 跟 B 是同樣的業務代碼產生的,非不同的業務,要使用資料庫的鎖來實作,怎么實作 ?
問這個問題的時候,面試官很耐心的解釋了這個場景,然后問我有沒有想起點什么來?其實就是想考察上面的關于資料庫鎖的問題,
11、mysql 索引是怎么實作的?
回答的是 B+ 樹,接著面試官繼續問:“能否大致描述一下 B+ 樹的大致結構 ?”,這塊內容沒怎么了解,直接認慫了,
快取相關
這塊內容是我專案上寫得有使用了多級快取的方案,然后面試官就這一塊問了下面的這些關于使用快取可能會遇到的問題,
12、快取擊穿、快取穿透 、快取雪崩 ?
13、熱點資料失效怎么解決?
這兩個問題,以前好好了解過,但是沒整理成自己的東西,面試的時候也說得云里霧里,
14、先刪快取還是先更新資料庫,為什么?
這里我說的:是先刪快取,然后再更新資料庫,但這是錯誤的,這里有非常大的問題,
想想這樣一個場景:
如果一個執行緒 A 先把快取洗掉了,然后去更新資料庫,那么在它刪了快取還沒有更新到資料庫的這個中間時間,執行緒B進來了,發現快取沒有,就去讀庫,這時候還是讀取還是舊的資料,然后又更新到快取去了,此時A 才把新資料寫到資料庫,
此時就產生了一個典型的問題就是“雙寫不一致”,
關于這塊問題的討論:《快取更新的套路》-陳皓老師
kafka

記一次阿里巴巴一面經歷,作為一名java程式員終于找到了自己差距
需要清晰系統圖的文末領取
15、kafka 的架構,包含了哪些角色?
這個問題我開始不知道怎么回答,就說了個 Broker,然后面試官提醒了一下:“不是我們平常還有生產者,消費呀什么的嗎 ?”額,我說還有生產者、消費者、主題呀等等,
這程序中面試官還提到說平常我們在搭建的時候要配置寫什么東西呀等等,按照官網的介紹說也行,
這里還有其他的比如Partition、消費者組、還有一個主要的 就是 zk 了,
這里建議大家好好的把 kafka 里面的這些概念、屬于、架構圖好好自己畫一下,不然真是關鍵時候真說不出來,但是他一提你又明白,這樣子肯定是不行的,面試是你說,不是面試官說,
16、kafka 的最小作業單元?
這個問題問得也是蒙圈,其實就是說我們在寫代碼的時候,要用kafka的時候,我們需要使用那些最基礎的組件,比如生產者、消費者、主題、偏移量 等等,
這個問題如果你們遇到,最好向面試官問清楚,
17、kafka 訊息重復消費的問題?冪等怎么做的?
剛開始面試官說,你知道kafka 訊息重復的問題嗎?有沒遇到,
我回答的是,會存在訊息重復消費的問題,我們在消費資料這端做了冪等處理來解決,
然后面試官繼續才問的是:冪等怎么來做的, 我說通過設定資料版本號,還有資料庫唯一索引等等,
面試官:“ok”,
這個問題,如果你能告訴面試官產生重復消費的情況,比如說投遞的時候重復了,消費的時候由于 offset 沒處理好等等問題導致的話,我想可能會更好,
18、kafka ack 機制?集群中的ack 是怎么實作的?
這里我只回答上了 ack 機制是啥,但是實作原理沒有回答上來,
Redis

記一次阿里巴巴一面經歷,作為一名java程式員終于找到了自己差距
需要清晰系統圖的文末領取
19、Redis 中有哪些資料結構
平常使用得最多的是 String , 還有 List 、Hash、Set、ZSet ,
沒有再問其他的內容,
但是像Redis 為什么這么快這種問題,我認為你應該要去了解,其他小伙伴經常遇到,也就是多路復用是個什么玩意兒?
原始碼
20、這里面試官問 你平常有沒有看過一些原始碼?框架的也行?JDK 的也行,
然后我說看了 HashMap 的原始碼,然后就巴拉巴拉的說了一哈大體的 put、get 流程 ,它的結構是什么樣子的,
這程序中還問到了 怎么判斷兩個物件是否相等?也就是 == 和 equals 的知識點,
其他的就沒再繼續問了,到這里整個電面程序結束了,說10個作業日內會給我答復此次面試情況,整個程序大概持續了40分鐘的樣子,
我知道,涼涼,
最后總結一下
上面的模塊雖然順序有變化,但是每個大塊里面的問題都是按照順序來的,基本上都是由淺入深、循序漸進的來問,
像資料庫鎖、執行緒池、快取問題 這些內容幾乎都是那種連環炮的形式,直到摸到你的底,
通過這次面試,親身體會到了差距,不過,更有方向了,
告誡大家一點東西:
平常多積累輸出:輸出或者教會別人是最好的學習方式,光看不練,幾天就忘,
- 先深后廣:深入學習,而不是只停留在使用API 的層面,一塊一塊系統的深入了解,再去搞其他的,
- 建立知識體系:把自己學習的內容形成博客也好,什么導圖也罷,記得把這些零散的內容,整理成自己的知識,
- 別抱有僥幸心理:別裸面,如果自己有整理的還是多看一下,多準備準備,大廠的面試會挖到你最深的部分,不要覺得只背一些面試題就是 ok的,題是背不完的,臨時抱佛腳基本上過不了關,如果你是靠背面試題進去的,那么你厲害,佩服,
- 隔一段時間就去面試吧:不要學我,待一家公司三年多,中途都沒有出去面過,出去面面才知道,哪些是需要去補充的,
有些問題可能答案這些不是太全面,需要你自己去動手,
希望這篇文章對你有幫助,哪怕只有一個點,都是值得的,如果其中有一些點你不了解,那么你是時候要去補充了,
別在自己的舒適區待太久,不然出不來,出來混,遲早是要還的!
一直待在相對傳統一點的企業,有四年半的 Java 開發經驗,會點大資料的內容,也跟客戶打過一年的交道,還帶過 10個月 10人+的技術團隊,有一定的協調組織能力,能夠理解 boss 的作業內容,也能很好的配合別人做事,
阿里云內部教程(面試答案)

SSM企業級實戰

大資料分析

面試大合集

java成神之路寶典,面試、檔案、書籍助你一步步成神,需要以上所有學習資料的朋友們勞煩轉發+評論,關注我私信回復“666”即可免費獲取
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/90302.html
標籤:AI
