相信不用我說,大家也都知道掌握併發程式設計對於一個 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 併發,讓你融匯貫通,形成全面系統的併發程式設計知識體系。最終可以得心應手地解決各種併發難題,同時將這些知識用於其他程式語言。