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





