JUC 套件架構概覽
java.util.concurrent (JUC) 由 Doug Lea 設計,提供高效能、執行緒安全的並發工具,取代低層級 wait/notify/synchronized,解決死鎖、活鎖、飢餓等經典問題。
核心介面與類別分類
| 類別 | 用途 | 關鍵特性 |
| Executor | 任務執行者介面 | 解耦任務提交與執行細節 |
| ExecutorService | 執行緒池管理 | 生命週期控制、Future 回傳、關閉機制 |
| ScheduledExecutorService | 排程任務 | 固定延遲/週期執行 |
| Future | 非同步結果 | get() 阻塞取得、cancel() 取消 |
| CompletableFuture | 組合式非同步 | thenApply/thenCompose/whenComplete 鏈式操作 |
| Lock/ReentrantLock | 顯式鎖 | 公平/非公平、可中斷、條件變數 |
| Semaphore | 計數信號量 | 資源池存取控制 |
| CountDownLatch | 倒數閂鎖 | 一次性等待多任務完成 |
| CyclicBarrier | 循環柵欄 | 可重複使用的集合點同步 |
| BlockingQueue | 阻塞隊列 | 生產者-消費者模式基石 |
| ConcurrentHashMap | 並發雜湊表 | 分段鎖/JDK8 CAS+Synchronized 高併發 |
| CopyOnWriteArrayList | 寫入複製陣列 | 讀多寫少場景最佳化 |
執行緒池建立最佳實踐
// 1. 固定大小執行緒池(適用於負載穩定)
ExecutorService fixed = Executors.newFixedThreadPool(4);
// 2. 快取執行緒池(適用於大量短任務)
ExecutorService cached = Executors.newCachedThreadPool();
// 3. 單一執行緒序列化執行
ExecutorService single = Executors.newSingleThreadExecutor();
// 4. 生產環境推薦:自訂 ThreadPoolExecutor 精確控制
ThreadPoolExecutor custom = new ThreadPoolExecutor(
4, // corePoolSize
8, // maximumPoolSize
60L, TimeUnit.SECONDS, // keepAliveTime
new LinkedBlockingQueue<>(100), // 有界隊列防止 OOM
new ThreadFactoryBuilder().setNameFormat("biz-worker-%d").build(),
new ThreadPoolExecutor.AbortPolicy() // 拒絕策略
);
同步工具實戰範例
Semaphore:資源池存取控制
// 模擬 2 個車位的停車場
Semaphore parking = new Semaphore(2);
void parkCar(int carId) {
parking.acquire(); // 獲取車位,無位則阻塞
try {
System.out.println("車輛 " + carId + " 進場");
Thread.sleep((long) (Math.random() * 5000));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
System.out.println("車輛 " + carId + " 離場");
parking.release(); // 釋放車位
}
}
CountDownLatch vs CyclicBarrier
- CountDownLatch:一次性計數器,主執行緒等待 N 個子任務完成(如應用啟動初始化)
- CyclicBarrier:可重置的集合點,N 個執行緒互相等待至同一屏障(如多階段並行計算)
CompletableFuture 非同步組合
CompletableFuture.supplyAsync(() -> fetchUser(1))
.thenApply(user -> enrichProfile(user))
.thenCompose(profile -> CompletableFuture.supplyAsync(() -> fetchRecommendations(profile)))
.whenComplete((result, ex) -> {
if (ex != null) log.error("推薦失敗", ex);
else render(result);
});
阻塞隊列選型指南
| 隊列 | 特性 | 適用場景 |
| ArrayBlockingQueue | 有界陣列、FIFO | 固定緩衝區、生產消費速率平衡 |
| LinkedBlockingQueue | 可選有界鏈表、FIFO | 預設無界、高吞吐生產消費 |
| PriorityBlockingQueue | 優先級堆、無界 | 任務優先級調度 |
| DelayQueue | 延遲堆、無界 | 定時任務、緩存過期清理 |
| SynchronousQueue | 零容量、直接移交 | 執行緒池 newCachedThreadPool 內部使用 |