ThreadLocalThreadLocal 은 한 스레드에서 읽고 쓰여질 수 있는 변수를 할당하여 접근할 수 있도록 합니다.
멀티 쓰레드 환경에서 각 쓰레드마다 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?