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