구분 ThreadLocal ScopedValue
변경 가능성 가변(Mutable) - 언제든 set() 가능 불변(Immutable) - 범위 내에서 변경 불가
유효 범위 쓰레드 생명주기 전체 (명시적으로 지워야 함) 특정 코드 블록(scope)으로 제한
메모리 효율 쓰레드마다 복사본을 가짐 (메모리 누수 위험) 여러 쓰레드가 값을 공유 가능 (가상 쓰레드에 최적화)
상속 InheritableThreadLocal로 가능 (비쌈) 자식 쓰레드(구조적 동시성)로 자동 상속 (저렴)

특징

메인 스레드 말고 다른 스레드에서 태스크를 실행하면 어떻게 될까?

A. 별개의 스레드에서 실행되는 실제 태스크는 바인딩된 ScopedValue를 상속받지 못함

중첩 스코프에서 ScopedValue 리바인딩

중첩된 스코프 안에서 동일한 이름의 ScopedValue에 새로운 값을 지정하되, 중첩된 스코프 안에서만 유효하도록 제한하는 것

ScopedValue와 구조적 동시성

일반적으로 ScopedValue는 자식 스레드에 자동으로 상속되지 않음

But, StructuredTaskScope 안에서 사용될 때는 해당 스코프 안에서 생성된 모든 자식 스레드가 ScopedValue 바인딩을 자동으로 상속받음

성능 고려사항

  1. 오버헤드 감소