ThreadLocal

ThreadLocal (스레드 지역 변수)

ThreadLocal<T>는 스레드마다 독립적인 값을 갖는 변수(스레드 지역 변수)를 제공하는 클래스입니다. 일반 변수와 달리, 각 스레드가 get() 또는 set() 메서드로 접근할 때 자신만의 독립적으로 초기화된 복사본을 갖게 됩니다.

출처: Java API Reference

본문

ThreadLocal 인스턴스는 보통 특정 상태(예: 사용자 ID, 트랜잭션 ID)를 스레드에 연관시키고자 하는 클래스의 private static 필드로 선언합니다.

public class ThreadId {
    private static final AtomicInteger nextId = new AtomicInteger(0);
    private static final ThreadLocal<Integer> threadId =
        ThreadLocal.withInitial(() -> nextId.getAndIncrement());
    public static int get() { return threadId.get(); }
}

각 스레드의 ID는 처음 ThreadId.get()을 호출할 때 할당되며, 이후 호출에서도 그 값이 유지됩니다. 공유 ThreadLocal 값에 대한 스레드별 복사본은 스레드마다 접근할 때마다 새로 생성됩니다.

이 클래스는 T 타입의 값을 보관하며, 주요 메서드로 get(), set(T), remove(), withInitial(Supplier) 등이 있습니다. 값이 설정되지 않았을 때 get()을 호출하면 remove() 이후와 동일하게 초기값이 반환됩니다.

주요 메서드로는 값을 읽는 get(), 값을 설정하는 set(T value), 값을 제거하는 remove()가 있으며, withInitial(Supplier<? extends T>)로 초기값을 제공할 수 있습니다.

remove()를 호출한 후 다시 get()을 호출하면 초기값이 다시 계산됩니다. 스레드 풀처럼 스레드를 재사용하는 환경에서는 값이 남지 않도록 명시적으로 remove()를 호출하는 것이 좋습니다.

메모리 누수를 방지하기 위해, 특히 서블릿이나 웹 애플리케이션 환경에서는 사용이 끝난 ThreadLocal 값이 제대로 정리되는지 확인해야 합니다.

더 알아보기 (Learn more)

Java 공식 API