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