1、多線程的目的是為了讓程序運(yùn)行的更快,但是并不是創(chuàng)建的線程越多越好,因?yàn)槎嗑€程面臨著如下問(wèn)題:
線程上下文切換;
死鎖的問(wèn)題;
受限與硬件和軟件資源的問(wèn)題;
2、線程上下文切換
單核處理器也可以執(zhí)行多線程的任務(wù),因?yàn)閏pu通過(guò)給線程分配時(shí)間碎片來(lái)做到;時(shí)間片是cpu分配給每個(gè)線程的執(zhí)行時(shí)間;該時(shí)間很短,cpu需要不停在的各個(gè)線程間切換,以達(dá)到多線程的目的;cpu通過(guò)循環(huán)算法來(lái)分配時(shí)間碎片,但是在切換前需要保存每個(gè)線程當(dāng)前的執(zhí)行狀態(tài)信息,以便之后在切換回來(lái),但是這樣切換的效率是很低的。
使用vmstat 1命令測(cè)量上下文切換的次數(shù),cs表示上下文切換次數(shù);
3、如何減少上下文切換
(1)無(wú)鎖并發(fā)編程:多線程競(jìng)爭(zhēng)鎖時(shí),會(huì)引起上下文切換,所以多線程處理數(shù)據(jù)時(shí)可以使用避免使用鎖,如按照數(shù)據(jù)id取hash算法取模分段,不同的線程處理不同段的數(shù)據(jù)(Segment),如:把一個(gè)list切分為不同段,分段處理也是一種方法;
(2)CAS算法
? ?使用cas算法來(lái)更新數(shù)據(jù),不需要使用鎖,以此減少鎖帶來(lái)的多線程問(wèn)題。
(3)使用最少線程
? ? 創(chuàng)建合理的線程數(shù),不要任務(wù)很少但是卻創(chuàng)建來(lái)很多的線程。
(4)協(xié)程
? ?在單線程里實(shí)現(xiàn)多任務(wù)的調(diào)度,并在單線程里維持多個(gè)任務(wù)間的切換。