ThreadLocal
ThreadLocal
은 한 스레드에서 읽고 쓰여질 수 있는 변수를 할당하여 접근할 수 있도록 합니다.
멀티 쓰레드 환경에서 각 쓰레드마다 get()
, set()
메서드를 통해 독립적으로 변수에 접근할 수 있습니다.
말그대로 Thread 내부에서 사용하는 지역변수입니다.
public class ThreadLocalTest {
// ThreadLocal 객체 생성
public static ThreadLocal<String> myThreadLocal = new ThreadLocal<>();
public static void main(String[] args) {
// ThreadLocal 객체에 변수 할당
myThreadLocal.set("Hello World!");
// ThreadLocal 객체의 변수 읽기
String myThreadLocalValue = myThreadLocal.get();
System.out.println(myThreadLocalValue);
// ThreadLocal에 할당되어 있는 변수들을 삭제
myThreadLocal.remove();
}
}
ThreadLocal의 활용
ThreadLocal
은 한 스레드에서 실행되는 코드가 동일한 객체를 사용할 수 있도록 해주기 때문에,스레드와 관련된 코드에서 파라미터를 사용하지 않고 객체를 전파하기 위한 용도로 주로 사용됩니다.
SpringSecurity
에서는 ThreadLocal
을 이용해서 사용자 인증 정보를 전파합니다.ThreadLocal
을 사용합니다.InheritableThreadLocal
이라는 ThreadLocal
을 상속받아 구현한 클래스를 이용하면 단일 스레드 뿐만 아니라 그 스레드에서 생성한 하위 스레드까지도 데이터를 공유해서 사용할 수 있습니다.ThreadLocal 사용 시 주의 사항
만약 쓰레드 풀과 같은 환경에서 ThreadLocal
을 사용한다면 ThreadLocal
변수에 보관되어 있는 데이터의 사용이 끝나면 반드시 remove()
메서드를 통해 삭제해주어야 합니다.
스레드 풀을 통해 스레드를 재사용하는 경우에 이전에 사용했던 값을 공유할 수 있기 때문입니다.
Ref.
[Java] ThreadLocal 정의 및 기본 사용법 - Tutorial(Sample)
Thread Local 개념과 내부 구조
Introduction to ThreadLocal
https://blog.gangnamunni.com/post/mdc-context-task-decorator/
https://honeyinfo7.tistory.com/323
https://torica-web.tistory.com/m/3
Is it safe to use ThreadLocal with CompletableFuture?