ThreadLocal

이호인·2022년 6월 8일
0

Java

목록 보기
5/6

📌 ThreadLocal 이란?

  • Thread 단위로 로컬 변수를 할당하는 기능을 제공하는 클래스.
  • 자바 1.2 버전부터 제공.

📌 사용하는 이유

  • 일반 변수의 수명은 특정 코드 블록 범위 내에서만 유효.
  • 변수 공유를 위해서는 파라미터로 받아서 사용.
  • 자신의 변수를 다른 곳에서 사용하게 하기 위해서는 리턴 값으로 제공해야함.

👉 ThreadLocal은 한 Thread에서 실행되는 코드가 동일한 객체를 사용할 수 있도록 해준다.
때문에 Thread와 관련된 코드에서 파라미터를 사용하지 않고 객체를 전파하기 위한 용도로 주로 사용된다.

  • 사용자 인증정보 전파
  • 트랜잭션 컨텍스트 전파
  • 쓰레드에 안전해야 하는 데이터 보관

등 쓰레드 기준으로 동작해야 하는 기능을 구현할 때 ThreadLocal을 유용하게 사용할 수 있다.

📌 ThreadLocal 사용 방법

ThreadLocal 객체 생성

  • Generic Type 사용 가능하다.
ThreadLocal<String> threadLocalGeneric = new ThreadLocal<>();

Default 초기값 설정 방법

  • initialValue method를 override 하면 이 ThreadLocal 변수를 사용하는 모든 Thread의 default 값이 존재하게 된다.
    👉 즉, 별도의 set 함수로 값 설정하기 전에도 get으로 default값을 꺼내 사용할 수 있다.
ThreadLocal<String> subThreadLocal = new ThreadLocal<String>() {
	@Override
    protected String initialValue() {
    	return "Init Value";
    }
}

현재 ThreadLocal에 값 저장 (set)

ThreadLocal<String> threadLocalGeneric = new ThreadLocal<>();
threadLocalGeneric.set("TEMP");

현재 ThreadLocal에서 값 불러오기 (get)

ThreadLocal<String> threadLocalGeneric = new ThreadLocal<>();
String result = threadLocalGeneric.get();

사용 완료 후 ThreadLocal 값 삭제 (remove) ❗️중요

  • 삭제하지 않으면 메모리 누수(Memory Leak)이 발생할 수 있다.
  • ThreadPool을 사용하는 환경에서는 Thread를 재사용되기 때문에 올바르지 않은 데이터를 참조할 수 있다.
  • ex) WAS는 Thread 생성 비용이 크기 때문에 ThreadPool을 가지고 Thread를 재사용한다.
ThreadLocal<String> threadLocalGeneric = new ThreadLocal<>();
threadLocalGeneric.set("TEMP");
System.out.println(threadLocalGeneric.get());
// output : TEMP

threadLocalGeneric.remove();
System.out.println(threadLocalGeneric.get());
// output : null

📌 reference!

ThreadLocal 이란 ?
ThreadLocal의 정의와 사용법
ThreadLocal 사용법과 활용
ThreadLocal 정의 및 기본 사용법 - Tutorial(Sample) - 코드 출처
Thread Local 개념과 내부 구조 - 사진 출처

profile
공부 기록

0개의 댓글