現代計算機系統為了提高 CPU 利用率,引入了多任務處理機制。從單核心的時間片輪轉,到多核心的真正並行執行,並發程式設計成為充分發揮硬體效能的關鍵。Java 作為企業級開發主流語言,提供了豐富的並發工具與機制。
NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATED。理解狀態轉換對診斷死結、飢餓等問題至關重要。
// 修飾實例方法:鎖住 this
public synchronized void method() { }
// 修飾靜態方法:鎖住 Class 物件
public static synchronized void staticMethod() { }
// 同步區塊:精確控制鎖範圍
public void method() {
synchronized(lockObject) {
// 臨界區程式碼
}
}
提供比 synchronized 更靈活的控制:可中斷鎖、超時等待、公平/非公平鎖、條件變數等。
定義主記憶體與工作記憶體交互規範,happens-before 規則是判斷執行緒安全的核心依據:
| 分類 | 代表類別 | 適用場景 |
|---|---|---|
| 並發 Map | ConcurrentHashMap | 高併發快取、計數器 |
| 阻塞佇列 | ArrayBlockingQueue, LinkedBlockingQueue | 生產者-消費者模式 |
| 執行緒安全集合 | CopyOnWriteArrayList/Set | 讀多寫少、遍歷頻繁 |
| 同步工具 | CountDownLatch, CyclicBarrier, Semaphore | 協調多執行緒執行順序 |
| 原子類別 | AtomicInteger, AtomicReference | 無鎖計數器、CAS 操作 |
ThreadPoolExecutor executor = new ThreadPoolExecutor(
4, 8, 60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(1000),
new ThreadFactoryBuilder().setNameFormat("biz-%d").build(),
new ThreadPoolExecutor.CallerRunsPolicy() // 拒絕策略:呼叫者執行
);
深入掌握 Java 並發需要理論結合實戰,建議從 JMM、synchronized、Lock、並發容器、執行緒池、CompletableFuture 等核心模組系統學習,並多閱讀優秀開源專案(如 Netty、Disruptor)原始碼。