main 方法本身即主線程。| 風險類別 | 典型表現 | 後果 |
|---|---|---|
| 安全性 | 競態條件、非原子操作、發布逸出 | 數據錯誤、對象損壞、安全漏洞 |
| 活性 | 死鎖、活鎖、飢餓 | 程序卡死、吞吐為零 |
| 性能 | 上下文切換、鎖爭用、偽共享、內存屏障開銷 | 吞吐下降、延遲抖動、CPU 浪費 |
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Thread: " + i);
}
}
}
// 使用
new MyThread().start(); // 必須調用 start(),而非 run()
public class MyTask implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Runnable: " + i);
}
}
}
// 使用
new Thread(new MyTask()).start();
// 或配合線程池
executor.execute(new MyTask());
優勢:職責分離 (任務 vs 執行策略)、支援 Lambda、可提交給任意 Executor、避免單繼承限制。
顏色創建銷毀線程開銷大、無限制創建導致 OOM,生產環境必須使用線程池。
newFixedThreadPool(n):固定大小,隊列無界 (LinkedBlockingQueue),任務堆積風險。newCachedThreadPool():可緩存,隊列 SynchronousQueue,線程數無上限 (Integer.MAX_VALUE),突發流量危險。newSingleThreadExecutor():單線程串行,保證任務順序。newScheduledThreadPool(n):定時/周期任務。ThreadPoolExecutor executor = new ThreadPoolExecutor(
10, // corePoolSize
50, // maximumPoolSize
60L, TimeUnit.SECONDS, // keepAliveTime
new LinkedBlockingQueue<>(1000), // 有界隊列,防 OOM
new ThreadFactoryBuilder().setNameFormat("biz-worker-%d").build(), // 命名便於排查
new ThreadPoolExecutor.CallerRunsPolicy() // 拒絕策略:調用者執行,緩衝壓力
);
executor.execute(() -> System.out.println("Task running"));
executor.shutdown(); // 優雅關閉
CallerRunsPolicy (緩衝)、AbortPolicy (拋異常)、DiscardOldestPolicy (丟棄最舊)。| 機制 | 關鍵字/API | 適用場景 |
|---|---|---|
| synchronized | 對象鎖 / 類鎖 | 簡單臨界區、方法級同步 |
| ReentrantLock | lock()/unlock()、tryLock()、Condition | 需可中斷、超時、公平鎖、多條件變量 |
| volatile | 字段修飾符 | 單變量可見性、禁止指令重排 |
| Atomic* | CAS 無鎖操作 | 計數器、狀態標誌、累加器 |
| ThreadLocal | 線程私有副本 | 上下文傳遞、數據庫連接、SimpleDateFormat |
| CountDownLatch | await()/countDown() | 主線程等待多子線程完成 |
| CyclicBarrier | await() | 多線程相互等待匯聚點 |
| Semaphore | acquire()/release() | 資源池限流 (連接池、許可證) |
| CompletableFuture | supplyAsync/thenApply/thenCombine | 異步編排、組合、異常處理 (JDK 8+) |
future.get() 或 重寫 afterExecute 記錄異常,否則異常吞沒無感知。shutdown() 拒絕新任務 → awaitTermination() 等待執行中任務完成。Java 多線程核心在於「任務提交交給線程池、共享數據用同步手段保護、異步編排用 CompletableFuture」。掌握 Runnable + ThreadPoolExecutor + synchronized/ReentrantLock + Atomic/ThreadLocal 基礎組件,並牢記避坑清單,即可應對 90% 並發編程場景。進階方向:JUC 源碼剖析、JMM 內存模型、鎖優化 (偏向/輕量/重量)、非阻塞算法、虛擬線程。