早期計算機單道批處理:用戶提交磁帶任務,CPU 執行一個,等待 I/O 時空閒,利用率極低。
為提高 CPU 利用率,需要內存同時駐留多個程序。進程 應運而生,作為:
單核 CPU 通過時間片輪轉,宏觀上「同時」運行多任務,微觀上交替執行。
進程切換開銷大(內存映射、文件表、上下文)。進程內部只能串行執行,無法並行處理多個子任務(如 GUI 響應、網絡通信、計算)。
Java 1.2+ 使用1:1 模型(每個 Java 線程映射一個內核線程),充分利用多核。
線程共享堆內存 → 多線程同時讀寫同一變量 → 競態條件 → 數據不一致。
// 經典非線程安全示例
class Counter { int count = 0; void inc() { count++; } }
// 兩線程並發調用 inc() 10000 次,結果往往 < 20000
解決方案:synchronized、Lock、AtomicInteger、ThreadLocal、無鎖算法等(後續文章詳述)。
| 場景 | 單核 CPU | 多核 CPU |
|---|---|---|
| CPU 密集型(計算、壓縮、加密) | 多線程降低性能(上下文切換開銷) | 多線程提升性能(並行利用多核) |
| I/O 密集型(網絡、磁盤、數據庫) | 多線程顯著提升(等待時切換執行其他) | 多線程提升(同步非阻塞/異步更優) |
| 混合型 | 視具體比例權衡 | 線程池隔離不同任務類型 |
ExecutorService 管理生命周期、復用線程、控制並發度