2025年9月17日 — Oracle 於昨日正式發布 Java 25,這是自 Java 21 以來首個長期支援(LTS)版本,帶來了18項 JDK 增強提案(JEP),其中 JEP 506:Scoped Values 的最終版本尤為引人注目。該功能在經過四輪預覽(JDK 20 至 JDK 24)後正式定案,為 Java 開發者提供了一個更高效且安全的資料分享機制,特別適用於虛擬執行緒(Virtual Threads)與結構化併發(Structured Concurrency)場景。
Scoped Values(JEP 506)是一種新的 Java 併發機制,旨在取代傳統的 ThreadLocal
變數,提供更簡單、更高效的方式在執行緒內及執行緒間分享不可變資料。與 ThreadLocal
不同,Scoped Values 被設計為與 Project Loom 的虛擬執行緒高度相容,具有更低的空間與時間成本,並且在程式碼可讀性和維護性上更具優勢。
根據 Oracle 的官方文件,Scoped Values 允許方法將不可變資料綁定到特定範圍(scope),並與其調用的方法或子執行緒共享,而無需顯式傳遞參數。這使得資料流的管理更加清晰,尤其適用於 AI 應用程式、Web 框架和微服務架構。
ThreadLocal
,Scoped Values 無需顯式傳遞上下文參數,減少了程式碼的複雜度。例如,開發者可以透過 ScopedValue.where()
綁定值,並在範圍內使用 get()
獲取,而無需修改方法簽名。以下是一個簡單的 Scoped Values 使用範例,展示如何在方法間共享上下文資料:
public class ScopedValueExample {
private static final ScopedValue<String> USER_ID = ScopedValue.newInstance();
public static void main(String[] args) {
ScopedValue.where(USER_ID, "user123").run(() -> {
processRequest();
});
}
private static void processRequest() {
String userId = USER_ID.get();
System.out.println("處理請求,使用者ID: " + userId);
}
}
在上述程式碼中,USER_ID
被綁定到 "user123"
,並在 processRequest
方法中直接存取,而無需顯式傳遞參數。一旦離開範圍,該值會自動清除,確保不會洩漏到其他執行緒。
相較於 ThreadLocal
,Scoped Values 的優勢在於:
ThreadLocal
在大量虛擬執行緒場景下可能導致記憶體和性能問題,而 Scoped Values 針對此進行了優化。ThreadLocal
可能導致的值洩漏問題。JEP 506 特別為 AI 應用程式和微服務架構帶來了顯著的改進。根據 Oracle 的說法,Scoped Values 能簡化在多執行緒環境中處理 AI 推論任務的資料分享,同時提升 Web 框架和微服務的性能。這對於需要快速處理大量並行請求的應用程式尤為重要。
例如,在 AI 推論場景中,Scoped Values 允許將模型參數或上下文資料高效地傳遞給不同的執行緒,無需複雜的同步機制,從而加速資料處理並降低錯誤風險。
業界對 JEP 506 的最終定案反應積極。荷蘭 Java 使用者組織(NLJUG)指出,Scoped Values 的正式推出標誌著 Java 在現代併發程式設計中的重大進步。同時,Techzine Global 報導稱,這項功能與結構化併發(JEP 505)結合,將為 AI 應用程式開發帶來顯著的便利性和性能提升。
JEP 506:Scoped Values 的最終版本為 Java 25 增添了強大的併發資料分享能力,進一步鞏固了 Java 在企業應用、AI 開發和微服務架構中的地位。開發者現在可以更輕鬆地撰寫高效、可維護的多執行緒程式碼,無需擔心傳統 ThreadLocal
的局限性。
欲了解更多詳情,請參閱 JEP 506 官方文件 或 Oracle 官方網站的 Java 25 發布公告。