????????線程作為操作系統調度的基本執行單元,是實現高吞吐、低延遲系統的基礎。
一、進程與線程的體系結構對比
核心概念:
- 進程(Process):操作系統資源分配的基本單位,擁有獨立的虛擬地址空間、文件描述符表、環境變量等。
- 線程(Thread):CPU 調度與分派的基本單位,屬于進程,共享進程的地址空間和資源,但擁有獨立的棧空間、程序計數器、寄存器集合。
關鍵區別:
資源開銷:線程創建/切換開銷遠小于進程(無需切換地址空間)。
通信效率:線程間共享內存,通信無需 IPC(進程間通信)機制。
健壯性:一個線程崩潰可能導致整個進程終止;進程間相互隔離。
?二、線程生命周期與狀態轉換
狀態詳解:
- NEW:線程實例化后,尚未調用?
start()
。 - RUNNABLE:已調用?
start()
,等待或正在 CPU 上執行(包含操作系統層面的 Running 和 Ready)。 - BLOCKED:等待進入?
synchronized
?代碼塊(等待獲取監視器鎖)。 - WAITING:調用?
Object.wait()
,?Thread.join()
,?LockSupport.park()
?后無限期等待。 - TIMED_WAITING:調用?
Thread.sleep()
,?Object.wait(timeout)
,?Thread.join(timeout)
?等帶超時的方法。 - TERMINATED:線程執行完畢或因未捕獲異常終止。
三、并發和并行
核心定義:
并發:多個任務在同一時間段內交替執行(宏觀上“同時”,微觀上分時復用 CPU)。適用于 I/O 密集型任務。
并行:多個任務在同一時刻真正同時執行(需多核/多處理器支持)。適用于 CPU 密集型任務。
并發是編程模型,解決任務調度問題;并行是硬件能力,解決計算加速問題。
四、線程安全與同步機制:競態條件與內存可見性
1. 競態條件
當多個線程非原子地訪問共享資源,且最終結果依賴于線程調度順序時,即發生競態條件。
public class Counter {private int count = 0;public void increment() {count++; // 非原子操作:讀取 → 修改 → 寫入}public int getCount() { return count; }
}
2. 同步原語
互斥鎖(Mutex / synchronized):確保同一時刻只有一個線程訪問臨界區。
信號量(Semaphore):控制同時訪問資源的線程數量。
條件變量(Condition Variable / wait/notify):線程間通信,實現等待/通知機制。
原子變量(Atomic Variables):CAS(Compare-And-Swap)操作實現無鎖線程安全。
3. 內存可見性
????????由于 CPU 緩存和編譯器優化,一個線程對共享變量的修改,可能不能立即被其他線程看到。volatile
關鍵字或同步塊可保證可見性。
五、線程調度與上下文切換開銷
調度策略:操作系統(如 Linux CFS)根據優先級、時間片等決定哪個線程獲得 CPU。
上下文切換(Context Switch):
????????保存當前線程狀態(寄存器、PC、棧指針等),恢復另一線程狀態。開銷包括:
直接開銷:CPU 緩存失效、TLB 刷新。
間接開銷:調度器計算、鎖競爭加劇。
優化建議:
????????避免創建過多線程(使用線程池)。
????????減少鎖競爭(無鎖數據結構、分段鎖)。
????????綁定 CPU 核心(減少緩存失效)。