歡迎光臨
每天分享高質量文章

看似簡單的併發面試題,卻暴露出了你技術的種種漏洞

相信不用我說,大家也都知道掌握併發程式設計對於一個 Java 程式員的重要性。但相對於其他 Java 基礎知識點來說,併發程式設計更加抽象,涉及到的知識點很多很零散,實際使用也更加麻煩。以至於很多人學完之後,根本不知道自己學了什麼。

 

我在面試的時候,經常會問這些問題:

執行緒池相關

 

問:你講講執行緒池的實現原理。

 

聽到這個問題,小部分同學會很坦白的說,我平時用過執行緒池,但是沒有瞭解過內部是怎麼實現的。偶爾也會有同學反懟,我會用不就行了麼,為啥要知道咋實現!

 

碰到這樣的同學,我只能說,嗯,你說的對。

 

我希望聽到的答案是,把每個引數的作用都說一遍,最好可以在紙上更加直觀的描述出來,各個引數在設定的時候需要註意什麼問題

 

有時候,有些同學語言組織的不太好,描述的時候有點含糊不清,為了能夠確定他瞭解的是否正確,我會直接提供一組執行緒池引數

 

問:現在設定 coreSize=5,maxSize=10,blockQueueSize=10,依次提交 6 個比較耗時的任務,執行緒池是如何執行的?

 

如果這樣還描述不清楚,那真的要 pass 了。

 

繼續問:你在什麼場景下使用過執行緒池,主要解決什麼問題?

 

面試者:巴拉巴拉說一堆 &%^($#@!

 

繼續問:那如果我給你一個場景,支付場景,A介面需要呼叫微信支付介面完成支付任務,呼叫微信支付介面被放在一個執行緒池中執行,假如微信介面的超時時間為2s,A 介面的 qps 大概是 100,如何設定執行緒池引數比較合理?

 

繼續問:如果涉及到有突發流量的場景,又該如何設定?

 

併發程式設計常見面試問題

 

舉幾個簡單的問題,大家自測一下,看看如果自己面試中遇到這些問題,能不能回答上來。比如

 

1. 悲觀鎖和樂觀鎖有什麼區別

2. 一不小心就死鎖了,怎麼辦?

3. 多執行緒同步和互斥有哪幾種實現方法?

4. 執行緒池解決什麼問題、執行緒池的原理、執行緒池使用時的註意事項

5. 如何避免重覆建立執行緒?

6. 多執行緒同步和互斥有哪幾種實現方法?

7. ReentranLock 原始碼,設計原理,整體過程

8. 如何批次執行非同步任務?

 

學習好高併發相關知識,不光是為了能在面試中不被面試官難到,更是為了能滿足工作的需求。我們常常被要求開發一個高併發的系統,而掌握併發程式設計正是其中的關鍵。

 

併發程式設計全景圖

 

那我們應該怎麼學習併發程式設計?是不是一上來就去看 Java SDK 的併發包?然後死記硬揹他們的使用場景?有沒有一張“全景圖”?

 

說實話,時至今日也還沒有一張普遍認可的“併發程式設計”全景圖,但下麵這張圖,看到的時候卻是讓我眼前一亮,是由資深架構師王寶令製成,從三個核心問題:分工、互斥、協作,全面且系統地涵蓋了Java 併發程式設計的技術難點

     

另外,王寶令在極客時間開設了《Java 併發程式設計實戰》專欄,絕對值得一看。

 

正如上面這張思維導圖所示,寶令在專欄中,會站在理論、模型的角度講解 Java 併發,讓你融匯貫通,形成全面系統的併發程式設計知識體系最終可以得心應手地解決各種併發難題,同時將這些知識用於其他程式語言。

    贊(0)

    分享創造快樂