| 구분 | ThreadLocal | ScopedValue |
|---|---|---|
| 변경 가능성 | 가변(Mutable) - 언제든 set() 가능 |
불변(Immutable) - 범위 내에서 변경 불가 |
| 유효 범위 | 쓰레드 생명주기 전체 (명시적으로 지워야 함) | 특정 코드 블록(scope)으로 제한 |
| 메모리 효율 | 쓰레드마다 복사본을 가짐 (메모리 누수 위험) | 여러 쓰레드가 값을 공유 가능 (가상 쓰레드에 최적화) |
| 상속 | InheritableThreadLocal로 가능 (비쌈) |
자식 쓰레드(구조적 동시성)로 자동 상속 (저렴) |
불변성
특정 스코프 내에서 ScopedValue가 어떤 값에 바인딩되면,
그 값은 ScopedValue가 살아있는 동안 변경할 수 없음
스레드 제한적 바인딩
유한한 수명
ScopedValue 바인딩은 특정 코드 블록의 실행 기간 동안만 유지.
해당 블록 끝나면 바인딩 해제
메인 스레드 말고 다른 스레드에서 태스크를 실행하면 어떻게 될까?
A. 별개의 스레드에서 실행되는 실제 태스크는 바인딩된 ScopedValue를 상속받지 못함
중첩된 스코프 안에서 동일한 이름의 ScopedValue에 새로운 값을 지정하되, 중첩된 스코프 안에서만 유효하도록 제한하는 것
일반적으로 ScopedValue는 자식 스레드에 자동으로 상속되지 않음
But, StructuredTaskScope 안에서 사용될 때는 해당 스코프 안에서 생성된 모든 자식 스레드가 ScopedValue 바인딩을 자동으로 상속받음