多核處理器普及、硬件成本下探,使得「並發」成為現代應用開發的核心課題。Java 5 引入的 java.util.concurrent (J.U.C) 包,標誌著並發編程從「語言內建機制」邁向「庫級框架」的新階段。
| 維度 | synchronized / Object.wait/notify | J.U.C (Lock/Condition) |
|---|---|---|
| 語法優雅度 | 高(塊結構自動釋放,編譯器保證匹配) | 低(手動 lock/unlock,易漏釋放) |
| 鎖粒度 | 僅互斥鎖,讀寫全串行 | ReadWriteLock、StampedLock 區分共享/互斥 |
| 條件變量 | 單條件 (wait/notify) | 一把 Lock 可建多個 Condition |
| 靈活性 | 低(必須在同步塊內 wait/notify) | 高(可中斷、超時、公平/非公平) |
| 單線程性能 | 極優(JVM 偏向鎖、輕量級鎖優化) | 稍高開銷 |
| 多線程吞吐 | 受限於完全互斥 | 顯著優於 synchronized |
核心痛點:傳統同步不區分「共享讀」與「互斥寫」,導致「讀多寫少」的典型場景無法發揮多核優勢。
早期 dl.u.c (Doug Lea 舊庫) 構建於 synchronized 之上;J.U.C 通過 sun.misc.Unsafe 直接調用 HotSpot VM 內部原語,映射到 CPU 原子指令 (CAS, LFENCE 等),實現「軟件實現 → 硬件實現」的質變,性能差距可達數量級。
synchronized 仍是最佳選擇(可讀、免維護)。單機並發解決「多核利用」,分布式並發解決「橫向擴展」。作者開源框架 Hosting Based Interfacing (HBI) 嘗試在 Java 服務端與 Flex/AS3 客戶端間構建統一並發模型,值得關注。
並發編程無銀彈。理解 synchronized 的優雅與局限,掌握 J.U.C 的工具箱,根據業務場景在「簡單正確」與「極致性能」間做權衡,才是架構師的核心價值。