[java] 스레드 로컬(Thread Local) 변수와 사용 예제

스레드 로컬(Thread Local) 변수는 멀티스레드 환경에서 여러 스레드가 동시에 접근할 수 있는 전역 변수를 개별 스레드 별로 관리할 수 있도록 도와주는 기능입니다. 이 기능은 자바의 ThreadLocal 클래스를 통해 제공됩니다.

스레드 로컬 변수의 개념

스레드 로컬 변수는 스레드마다 독립적인 값을 가질 수 있는 변수입니다. 다른 스레드에서 접근할 수 없고, 각 스레드에서만 접근이 가능합니다. 이렇게 함으로써, 각각의 스레드에 대해 독립적인 상태를 유지하면서 전역 변수를 사용할 수 있습니다.

스레드 로컬 변수는 ThreadLocal 클래스를 사용하여 생성하고 관리합니다. ThreadLocal 객체를 생성한 후 set() 메서드로 값을 설정하고, get() 메서드로 값을 읽어올 수 있습니다. 각 스레드는 자신의 ThreadLocal 객체를 통해 값을 저장하고 가져올 수 있습니다.

스레드 로컬 변수 사용 예제

다음은 스레드 로컬 변수를 사용하는 예제입니다.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadLocalExample {
    private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);

        for (int i = 0; i < 5; i++) {
            final int index = i;
            executorService.submit(() -> {
                threadLocal.set(index);
                System.out.println("Thread " + Thread.currentThread().getId() + ": " + threadLocal.get());
                threadLocal.remove(); // 값을 삭제해주지 않으면 메모리 누수가 발생할 수 있음
            });
        }

        executorService.shutdown();
    }
}

위 예제는 5개의 스레드로 구성된 스레드 풀을 생성하고, 각 스레드에서 스레드 로컬 변수를 사용하여 값을 저장하고 출력하는 예제입니다. ThreadLocal 객체를 static으로 선언하였기 때문에 모든 스레드에서 동일한 객체를 참조할 수 있습니다. 이후에는 각 스레드에서 set() 메서드로 값을 설정하고, get() 메서드로 값을 읽어옵니다. 마지막에는 remove() 메서드를 호출하여 값을 삭제해주어야 합니다.

스레드 로컬 변수의 활용

스레드 로컬 변수는 다음과 같은 경우에 유용하게 활용할 수 있습니다:

마무리

스레드 로컬 변수는 멀티스레드 환경에서 스레드간의 독립된 값을 유지하면서 전역 변수를 사용할 수 있게 해주는 유용한 기능입니다. ThreadLocal 클래스를 사용하여 스레드 로컬 변수를 생성하고 사용할 수 있습니다. 위 예제를 통해 스레드 로컬 변수의 개념과 사용법을 익힐 수 있습니다.


참고 자료: