隨著多核處理器普及且成本下降,並發程式設計已進入黃金時代。Java 5 引入的 java.util.concurrent (JUC) 套件雖然設計不如傳統 synchronized 優雅,但解決了關鍵效能瓶頸。
傳統 synchronized 不區分「共享同步」(讀操作) 與「互斥同步」(寫操作),所有同步皆為完全排他。這與大多數應用「讀多寫少」的並發模式嚴重背離,導致硬體新增的並發能力在普通應用中大打折扣。此外,Object.wait()/notify() 必須在同步區塊內執行,且一個物件只能對應一個等待條件,靈活性不足。
JUC 透過 Lock 與多個 Condition 實現細粒度控制,底層利用 sun.misc.Unsafe 直接呼叫 CPU 原子指令,從軟體實現升級為硬體實現,效能大幅提升。Executor、ScheduledExecutorService、Future、BlockingQueue 等成為建構應用伺服器的基石。
JVM 正持續優化單執行緒下的同步開銷,但多執行緒爭用時效能仍有提升空間。主流應用開發是否會直接建構在這些底層工具之上,仍值得觀望。可以預見,隨著專案 Loom (虛擬執行緒) 等技術成熟,Java 並發模型將邁向更高層次的抽象與效能平衡。