小小棣
從事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內存模型是怎樣的?線程間如何通信?如何共享數據?
...