[Java] ThreadLocal

나르·2022년 7월 26일
0

JAVA

목록 보기
11/18
post-thumbnail

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?

profile
💻 + ☕ = </>

0개의 댓글