引言
作為一名資深的 Java 摸魚工程師
又到了一年一度的校招季,老闆笑嘻嘻地遞來了簡歷,語重心長地對我説:“給團隊注入點新鮮血液!”
我信心滿滿地打開視頻面了這個同學
結果……他直接甩了我一句“老古董”,然後啪,把視頻掛了。
我:???
面試中
買了一杯星巴克,我坐進了電話亭,看了一下簡歷
學歷不錯嘛,985本碩,字節、螞蟻、阿里實習一圈,還自稱“精通多線程、高併發”。
我抿了一口咖啡,內心OS:“小夥子挺能吹,看我待會兒怎麼用八股文給你上上強度。”
連線中.....
我(職業假笑):“你好,是狂少同學嗎?我是xx公司面試官,看你簡歷寫有多線程高併發經驗,咱直接從這個開始吧?”
狂少表現的略顯緊張:“emmm,好的,老師,您問”
作為一名專業的面試官,面試一定要由淺入深,挖掘面試者最大的潛能,我起手先來一句:“線程池使用過嗎?給我講一下他的基本參數有哪些?”
狂少:“好的,老師,我使用過線程池,我先給您簡單介紹一下線程池的基本參數,首先第一個參數是核心線程數 corePoolSize,他是常駐在系統裏的,不會被銷燬”
“stop,停一下”,我心想你小子還是年輕光知道背八股是吧,我直接打斷施法,冷笑一聲繼續説到 “核心線程數一定不會被銷燬麼?你説錯了”
空氣突然安靜,我心裏此時想到,“不愧是我,還得是我經驗老道”
狂少補充到:“老師,我的意思是沒,一般情況下是不會被銷燬的,當然你要是想銷燬是可以通過 executor.allowCoreThreadTimeOut(true) 來設置的”
我清了清嗓:“咳咳,對,這個作為程序員我們表達要嚴謹,你看看我差點誤解你了,行,那你繼續説説你一般是怎麼設置這個線程池的核心線程數的”
狂少回答到:“一般情況下,我們在開始壓測前都有一個理想值,然後我們都是根據業務場景來壓測獲得這個值的”
“啥玩意回答的,這不是我想聽的八股”,但是作為一名好的面試官,我要學會引導面試者,於是我很耐心的説到“真正幹活中哪裏來的這麼多時間給你壓測,直接按照 CPU 密集型是 N+1,IO 密集型是 2N 就行”
狂少這時候皺了一下眉頭,我心想:“你這小子還不相信”,於是我直接一個電子書發到了他的釘釘上,“同學,我發你一本《Java併發編程》電子版,第八章明明白白寫着呢!菜就多練”
這個時候狂少突然被我説的,臉上掛不住,反問了我一句:“老登,Tomcat默認線程數你説是2N嗎?為什麼是2N?你知不知道它實際怎麼設置的?”
我一時以為我聽錯了,我不是老師麼,怎麼變成老登了
“為什麼設置 2N,書都發給你了不會看,線程數等於 CPU 核心數 CPU 利用率 (1 + CPU 等待時間/CPU 計算時間),這個公式下 IO 密集型的 計算時間 = 等待時間,那就是 CPU 核心數 CPU 利用率 2,我設置 2N 一點毛病沒有” 我臉紅耳赤的爭辯到
這時狂少突然提高了音量:“哼,還 2N,你不通過壓測你怎麼知道適合你的業務場景,我告訴你,我之前接觸過的一個場景,我們都是設置 5N 的核心線程數,你那一套早過時了”
我繼續爭辯到:“你是書包麼,這麼能裝,還 5N ,書上還能寫錯不成,你 5N 你的線程上下文切換開銷你受得了麼”
“都 2025 年了,還在 CPU 上下文切換開銷,現在的機器上下文切換耗時都只在 1~5 微妙,你告訴我這有什麼耗時,這點損耗計較個雞毛啊,肯定得壓測才能得出具體合適的值,老古董,我不面了”
我(試圖挽尊):“你別走!我還沒……”
嘟——嘟——嘟——
電話亭裏,只剩下我,一杯涼透的星巴克
以及空氣中循環播放的“老古董……老古董……老古董……”
結尾
(一陣急促的敲門聲突然響起)
我沒好氣的説到:“誰啊?!沒看見正在面試呢”
門緩緩打開,只見老闆端着兩杯熱騰騰的拿鐵走了進來。老闆笑眯眯的説:“面得怎麼樣?”
我:“別提了,現在年輕人太狂了,説我是老古董...”
老闆拍拍了我肩:“知道為什麼我特意讓你面他嗎?”
老闆突然壓低聲音:“那是公司剛挖來的CTO的兒子,專門讓他來試試水深的。”
我瞬間石化了:“卧槽?!你不早説?!”
老闆這時候給我遞過拿鐵:“穩住!他剛給我發消息了...”
(手機屏幕亮起)
狂少:你們這面試官有點東西啊,雖然古板但基礎挺紮實,就是需要一點變通
我:“!!!!!!”
(手中的拿鐵劇烈顫抖)
遠處隱隱傳來老闆的補刀:“他説下週要來給你做專場培訓...”