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