스레드 로컬(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
클래스를 사용하여 스레드 로컬 변수를 생성하고 사용할 수 있습니다. 위 예제를 통해 스레드 로컬 변수의 개념과 사용법을 익힐 수 있습니다.
참고 자료: