怎麼樣才算得上熟悉多線程編程呢?

小小棣

從事JAVA開發多年,見證了多線程作為考驗一個人編程能力的重要指標,是如何難到眾多英雄好漢的!

為什麼多線程難以掌握?因為多線程涉及到底層數據處理,同時概念抽象,模型複雜,出現問題難以復現等特性!


先來看下為什麼要使用多線程?我們都知道,單核CPU同一時間只能計算一個線程的數據,而在傳統的網絡編程或者io很容易受到網絡延遲,卡頓等影響導致線程處於阻塞狀態,這個時候的CPU也處於停滯狀態,影響了計算性能的提高!所以引入了多線程技術。。。

單核多線程:在單核CPU中,我們可以在一個線程阻塞的同時,新啟一個線程進行處理,等到這個線程處理完的時候再喚醒其他線程!

多核多線程:多核之間,線程並行處理,單核之內使用上面的模型進行處理!

怎麼樣算是熟悉多線程呢?光是上面的概念可不夠!


1,先解決性能:多線程最根本的需求還是充分"壓榨"CPU資源進行計算,使用多線程避免阻塞,並行計算等是最起碼要會做的,

①,使用繼承Thread和實現Runnable方式實現多線程,掌握線程狀態,喚醒,休眠等方法處理!

②,使用線程池,防止線程頻繁創建和釋放的資源開銷!

③,使用並行處理框架forkjoin和parelleStram處理並行多線程!

④,使用ThreadLocal本地變量避免線程間變量汙染!

⑤,使用future和callable實現線程完成回調!

⑥,會編寫master-workers模型,即一個主線程處理連接,接收任務等,分發給多個執行線程進行處理,這是一個比較高效和經典的模型,值得研究!reactor和netty基於這種模型!


2,再處理安全:多線程因為不可控性,容易引發數據安全問題

①,使用各種鎖,保證數據安全!包括synchonize,readwriterlock(讀鎖共享,寫鎖獨佔),等!

②,使用線程方法實現,線程的順序執行!

③,生產者消費者模型:最常見的模型,保證數據不會重複處理!

④,防止死鎖:順序性的佔有鎖等,避免死鎖!

⑤,使用線程安全的類,concureentMap,hashtable!

⑥,學會樂觀鎖和悲觀鎖編程(之前的文章中有提到過)!

最後,像cyclicBarrier,CountdownLatch的也經常用做倒計數編程等,需要掌握!

JAVA多線程難倒了很多了高手啊,你是被難倒的那一個嗎?有問題歡迎隨時交流,更多的技術分享,敬請關注。。。


謝逅架構

簡單的:線程是什麼?線程是如何工作的?如何創建一個線程?創建線程的幾種方式有什麼區別,應用場景是哪些?

一般的:線程池是什麼,用來解決什麼問題?線程池參數怎麼配置,怎麼優化?

進階的:線程安全是什麼?如何編寫一個線程安全的程序?加鎖,原子操作,volatile區別是啥?java內存模型是怎樣的?線程間如何通信?如何共享數據?

...


分享到:


相關文章: