スコープ付き値
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サポート
スコープ付き値
利用可能
JDK 25 LTSで正式リリース(JEP 506、2025年9月)。
仕組み
ScopedValueはイミュータブルで継承可能なスコープ限定のコンテキストを提供します。ThreadLocalとは異なり、スコープ付き値は自動的にクリーンアップされ、バーチャルスレッドで動作し、呼び出し先から変更できません。
関連ドキュメント