본문 바로가기
개발자 랩실/스프링&스프링부트

[Java] ThreadLocal

by sina.dev 2022. 3. 4.
728x90

목차

  1. ThreadLocal이란
  2. ThreadLocal 사용 이유
  3. ThreadLocal 사용 방법
  4. ThreadLocal 유의 사항

 


1. ThreadLocal 이란

  • ThreadLocal은 자바의 class이다. 멀티스레드 환경에서 사용되는 스레드마다 독립적인 변수를 가져 접근할 수 있게 한다. 그래서 한 스레드에 의해 읽고 쓰여진다.

 


2. ThreadLocal 사용 이유

  • 싱글톤 패턴의 사용이나 static 객체의 사용에서 볼 수 있는 동시성 문제를 해결하고자 사용을 한다.
  • 싱글톤이나 static 객체는 메모리에 하나만 올라가기 때문에 여러 번 호출하게 되면 메모리에 올라간 인스턴스의 반환 값이 달라지는 문제가 있다.

 


3. ThreadLocal 사용 방법

  1. ThreadLocal 객체를 생성한다.
  2. ThreadLocal.set() 메서드를 이용해서 현재 스레드의 로컬 변수에 값을 저장한다.
  3. ThreadLocal.get() 메서드를 이용해서 현재 스레드의 로컬 변수 값을 읽어온다.
  4. ThreadLocal.remove() 메서드를 이용해서 현재 스레드의 로컬 변수 값을 삭제한다.

 

예제

public class ThreadLocalExam_2 {

    public static void main(String[] args) {
        Thread first = new Thread(() -> {
            System.out.println("first thread = " + Context.threadLocal.get());
            Foo foo = new Foo("first thread = ");
            foo.foo();
        });

        Thread second = new Thread(() -> {
            System.out.println("second thread = " + Context.threadLocal.get());
            Foo foo = new Foo("second thread = ");
            foo.foo();
        });

        first.start();
        second.start();
    }
}

 

메소드

  • set() : ThreadLocal에 값을 초기화
  • get() : ThreadLocal에 있는 값을 가져오기
  • remove() : ThreadLocal 값 제거

 


4. ThreadLocal 유의 사항

  • ThreadLocal은 메모리 누수의 원인이 될 수 있다. Thread pool 환경에서 ThreadLocal을 사용하는 경우 변수에 보관된 데이터 사용이 끝나면 반드시 해당 데이터를 삭제해줘야 한다. 그렇지 않을 경우 재사용 되는 스레드가 올바르지 않은 데이터를 참조할 수 있다.
  • ThreadLocal 사용 시 static으로 선언해야 한다.

 

 

댓글