1健蕊、多線程的目的是為了讓程序運行的更快菱阵,但是并不是創(chuàng)建的線程越多越好,因為多線程面臨著如下問題:
線程上下文切換缩功;
死鎖的問題晴及;
受限與硬件和軟件資源的問題;
2嫡锌、線程上下文切換
單核處理器也可以執(zhí)行多線程的任務虑稼,因為cpu通過給線程分配時間碎片來做到;時間片是cpu分配給每個線程的執(zhí)行時間世舰;該時間很短动雹,cpu需要不停在的各個線程間切換槽卫,以達到多線程的目的跟压;cpu通過循環(huán)算法來分配時間碎片,但是在切換前需要保存每個線程當前的執(zhí)行狀態(tài)信息歼培,以便之后在切換回來震蒋,但是這樣切換的效率是很低的。
使用vmstat 1命令測量上下文切換的次數(shù)躲庄,cs表示上下文切換次數(shù)查剖;
3、如何減少上下文切換
(1)無鎖并發(fā)編程:多線程競爭鎖時噪窘,會引起上下文切換笋庄,所以多線程處理數(shù)據(jù)時可以使用避免使用鎖,如按照數(shù)據(jù)id取hash算法取模分段,不同的線程處理不同段的數(shù)據(jù)(Segment),如:把一個list切分為不同段直砂,分段處理也是一種方法菌仁;
(2)CAS算法
? ?使用cas算法來更新數(shù)據(jù),不需要使用鎖静暂,以此減少鎖帶來的多線程問題济丘。
(3)使用最少線程
? ? 創(chuàng)建合理的線程數(shù),不要任務很少但是卻創(chuàng)建來很多的線程洽蛀。
(4)協(xié)程
? ?在單線程里實現(xiàn)多任務的調(diào)度摹迷,并在單線程里維持多個任務間的切換。