Java 內建多執行緒支援是其區別於 C/C++ 早期版本的標誌性特性。將執行緒從作業系統層面抽象為語言級一等公民 (java.lang.Thread、Runnable、synchronized、wait/notify),極大降低了併發程式開發門檻。本文從執行緒創建方式、生命週期狀態、同步機制、共享記憶體模型、常見陷阱五個維度,系統梳理 Java 多執行緒核心知識體系。
class MyThread extends Thread {
@Override
public void run() {
// 執行緒執行主體
System.out.println("Thread running: " + getName());
}
}
// 使用
new MyThread().start(); // 必須呼叫 start(),而非 run()
缺點:Java 單繼承限制,已繼承其他類則無法使用;執行緒邏輯與執行緒控制耦合。
class MyTask implements Runnable {
@Override
public void run() {
System.out.println("Task running in: " + Thread.currentThread().getName());
}
}
// 使用
Thread t = new Thread(new MyTask());
t.start();
// 或 Java 8+ Lambda
new Thread(() -> System.out.println("Lambda task")).start();
優點:邏輯與控制分離,可提交給執行緒池 (ExecutorService)、定時任務、CompletableFuture 等多種執行器複用。
Callable task = () -> { Thread.sleep(1000); return 42; };
FutureTask ft = new FutureTask<>(task);
new Thread(ft).start();
Integer result = ft.get(); // 阻塞獲取結果
Java 定義 6 種標準狀態 (Thread.State enum):
NEW (新建) │ start() ▼ RUNNABLE (可執行) ◄──────────────────┐ │ │ │ 获得 CPU 時間片 │ 釋放 CPU / 等待資源 ▼ │ RUNNING (運行中) ────────────────────┘ │ ├── sleep()/wait()/join() / I/O 阻塞 ──► BLOCKED / WAITING / TIMED_WAITING │ │ │ │ 資源就緒 / 超時 / notify / interrupt │ ▼ │ RUNNABLE │ └── run() 結束 / 異常拋出 ──► TERMINATED (終止)
synchronized 區塊/方法 (鎖被佔用)。Object.wait()、Thread.join()、LockSupport.park()。sleep()、wait(timeout)、join(timeout)、parkNanos()。public synchronized void method() 鎖 this (實例) 或 Class 物件 (靜態)。synchronized(lockObj) { ... } 精確控制鎖範圍、鎖物件。volatile int i; i++; 非原子 (讀-改-寫三步驟)。volatile boolean shutdown)、雙重檢查鎖單例、獨立寫入讀取變數。synchronized(obj) 內部)。obj.wait():釋放鎖,進入等待集合。obj.notify():喚醒一個等待執行緒 (隨機)。obj.notifyAll():喚醒所有等待執行緒 (推薦,避免信號丟失)。
// 等待方
synchronized (lock) {
while (conditionNotMet) lock.wait(); // while 防虛假喚醒
// 執行邏輯
}
// 通知方
synchronized (lock) {
updateCondition();
lock.notifyAll();
}
volatile、synchronized、final、Thread.start/join、Lock.lock/unlock 建立 **happens-before** 關係,保證跨執行緒可見性與有序性。| 工具 | 用途 | 關鍵特性 |
|---|---|---|
ReentrantLock | 替代 synchronized | 可中斷、超時、公平/非公平、Condition 多條件變數 |
ReadWriteLock | 讀多寫少 | 讀共享/寫互斥、降級支援 |
Semaphore | 資源池控制 | 許可證計數、可中斷獲取 |
CountDownLatch | 一次性等待多任務 | 計數歸零觸發、不可重置 |
CyclicBarrier | 循環等待多執行緒 | 計數歸零觸發屏障動作、可重置 |
Phaser | 階段性同步 | 動態註冊/取消、多階段 |
Exchanger | 雙執行緒資料交換 | 配對交換、基因演算法、管道流 |