隨著多核處理器普及,過去依賴的「僥倖正確」在多核環境下徹底失效。Brian Goetz 指出:Intel/SPARC 處理器提供比 JVM 要求更強的存儲保證,導致許多同步/volatile 錯誤用法長期隱藏。多核時代來臨,這些隱患全面爆發。
Swing GUI、Servlet 容器 等常見場景本質上都是多線程環境。你以為不用多線程就沒事?其實你早已身在其中。
將主存視為「共享池」導致對可見性、重排序的錯誤判斷。即使是不可變值,若無正確同步/volatile,其他線程可能完全看不到。
經典的爛模式,在舊內存模型下看似可行,實則極其危險。
如文章示例:200 條線程並發 i++,50% 機率結果不是 200。++ 非原子操作(讀-改-寫三步),必須同步或用 AtomicInteger。
產品在用戶多核機器出現問題,測試環境(單核/雙核)從未復現。禁用一個核心即解決。這正是「僥倖正確」徹底失效的鐵證。
每個寫 Java 的人都應該讀這本書。它系統性梳理了內存模型、同步策略、線程安全類、執行框架等核心知識,配大量分析與範例。
Scala 等 JVM 語言引入不可變對象、無共享、基於 Actor 的訊息傳遞機制(源自 Erlang),為解決棘手並發問題提供新路徑。但這是另一個話題了。
多核不等人,正確並發編程刻不容緩。