多線程的優(yōu)勢:
可并行處理任務(wù),減少單個任務(wù)的等待時間;
線程較進(jìn)程開銷更??;
線程間可共享資源;
多核情況下可充分利用CPU資源。發(fā)揮多處理器的強(qiáng)大性能,提升資源利用率以及系統(tǒng)的吞吐率。
提供更好的GUI交互體驗(如騰訊視頻可邊下邊播)
充分利用服務(wù)器硬件資源;
提高服務(wù)吞吐量、降低響應(yīng)時間;
分布式系統(tǒng);
資源的爭用、可伸縮性;
多線程并發(fā)內(nèi)存消耗比較少;
每個線程需要一個Thread stack保存線程場景,Thread stack一般需要十幾到幾十kb內(nèi)存,不像多進(jìn)程,每個進(jìn)程需要加載完整的應(yīng)用環(huán)境,需要分配十幾到上百M(fèi)B內(nèi)存。
線程可以共享資源,特別是可以共享整個應(yīng)用環(huán)境,不必像進(jìn)程每個進(jìn)程要加載應(yīng)用環(huán)境。
多線程并CPU消耗比較小。
線程的場景切換小于進(jìn)程的場景切換。
很容易創(chuàng)建和高效利用共享資源。
數(shù)據(jù)庫線程池。
字典表,進(jìn)程內(nèi)緩存。
IO并發(fā)能力很高。
java VM可以輕松維護(hù)幾百個并發(fā)線程的線程切換開銷,遠(yuǎn)高于多進(jìn)程單服務(wù)器上幾十個并發(fā)的處理能力。
可有效利用多核CPU,實現(xiàn)并行運(yùn)算。
多線程帶來的問題:
1、VM 的內(nèi)存管理要求超高,對內(nèi)存管理要求非常高,應(yīng)用代碼稍不注意,就會產(chǎn)生OOM,需要應(yīng)用代碼長期和內(nèi)存泄漏做斗、爭。GC的策略會影響多線程并發(fā)能力和系統(tǒng)吞吐量,需要對GC策略和調(diào)優(yōu)有很好的經(jīng)驗。
在大內(nèi)存服務(wù)器上的物理內(nèi)存利用率問題。VM內(nèi)存堆不宜過大,一般2GB為宜。過大的內(nèi)存堆或造成GC效率下降。在物理內(nèi)存很多的服務(wù)器上為了有效利用更多內(nèi)存,不得不跑多個java VM,增加了復(fù)雜度。
對共享資源的操作。對共享資源的操作要非常小心,特別是修改共享資源需要加鎖操作,很容易引發(fā)死鎖問題。
應(yīng)用代碼和第三方庫都必須是線程安全的。使用了非線程安全的庫會造成各種潛在難以排查的問題。
單進(jìn)程多線程模型不方便通過操作系統(tǒng)管理。一旦出現(xiàn)死鎖或者線程阻塞很容易導(dǎo)致整個VM進(jìn)程掛起失去響應(yīng),隔離性很差。
2、設(shè)計更復(fù)雜:
資源共享、數(shù)據(jù)一致性及可見性、調(diào)試?yán)щy;線程安全問題。
3、性能開銷:
鎖競爭、上下文切換開銷、內(nèi)存開銷