Concurrency 上級

ThreadLocalの問題なしにコールスタック間でデータを安全に共有する。

✕ Java 8
static final ThreadLocal<User> CURRENT =
    new ThreadLocal<>();
void handle(Request req) {
    CURRENT.set(authenticate(req));
    try { process(); }
    finally { CURRENT.remove(); }
}
✓ Java 25
static final ScopedValue<User> CURRENT =
    ScopedValue.newInstance();
void handle(Request req) {
    ScopedValue.where(CURRENT,
        authenticate(req)
    ).run(this::process);
}
このコードに問題がありますか? お知らせください。
🔒

イミュータブル

呼び出し先はスコープ付き値を読み取ることはできますが、変更はできません。

🧹

自動クリーンアップ

手動のremove()不要 — 値はブロックにスコープされます。

バーチャルスレッド対応

何百万ものバーチャルスレッドで効率的に動作します。

旧来のアプローチ
ThreadLocal
モダンなアプローチ
ScopedValue
JDKバージョン
25
難易度
上級
スコープ付き値
利用可能

JDK 25 LTSで正式リリース(JEP 506、2025年9月)。

ScopedValueはイミュータブルで継承可能なスコープ限定のコンテキストを提供します。ThreadLocalとは異なり、スコープ付き値は自動的にクリーンアップされ、バーチャルスレッドで動作し、呼び出し先から変更できません。

共有 𝕏 🦋 in