第1章 并發編程的挑戰
1.1 上下文切換
即使是單核處理器也支持多線程執行代碼,CPU給每個線程分配CPU時間片實現多線程,而每個時間片一般是幾十毫秒,所以多個線程感覺是同時執行的
但同一個核切換線程執行時會保存運行狀態,以便下次切回來后讀取運行,所以有上下文切換
1.1.1 多線程一定快嗎?
不一定,線程有創建和上下文切換的開銷
1.1.2 測試上下文切換次數和時長
略P3
1.1.3 如何減少上下文切換
1>無鎖并發編程
當多線程競爭鎖時,會引起上下文切換,所以多線程處理數據時,可以避免使用鎖,如:分段處理,不同線程處理不同段上的數據
2>CAS算法:Java的Atomic包使用CAS算法來更新數據,而不需要加鎖。
3>使用最少線程
避免創建不需要的線程
4>協程:
在單線程里實現多任務的調度,并在單線程里維持單個任務間的切換
1.1.4 減少上下文切換實戰
P4空線程多了會影響上下文切換
1.2 死鎖
1>排查:查看dump文件中堵塞狀態的線程
2>如何避免線程死鎖
①避免一個線程同時獲取多個鎖
②避免一個線程在鎖內占用多個資源
③嘗試使用定時鎖,使用Lock.tryLock(timeout)替代內部鎖
1.3 資源限制的挑戰
1>硬件與軟件資源會限制多線程效率,如帶寬為2Mb/s,而下載速度為1Mb/s,開10個線程也不會編程10Mb/s,最多開兩個
2>CPU利用率100%時,也應該考慮減少運算線程
3>軟件資源一般為連接數,線程應與可拿到的連接數相關
4>內存使用過多會oom,此時也必須減少工作線程