[java] 쓰레드 로컬 변수(Thread Local Variables)

쓰레드 로컬 변수(Thread Local Variables)는 각각의 쓰레드에 고유한 값을 유지하는 데 사용됩니다. 각각의 쓰레드는 독립적인 로컬 변수를 가질 수 있으며, 이는 쓰레드 간의 값 공유를 방지하고 동시에 각 쓰레드가 독립적으로 값을 변경할 수 있도록 해줍니다.

쓰레드 로컬 변수의 사용

import java.util.concurrent.atomic.AtomicInteger;

public class ThreadLocalExample {

    private static final ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 0);
    private static final AtomicInteger globalValue = new AtomicInteger(0);

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                int local = threadLocalValue.get();
                local++;
                threadLocalValue.set(local);
                
                int global = globalValue.getAndIncrement();
                
                System.out.println("Thread local value: " + threadLocalValue.get() + ", Global value: " + globalValue.get());
            }).start();
        }
    }
}

위의 예제는 ThreadLocal을 사용하여 쓰레드 로컬 변수를 생성하고 각 쓰레드에서 해당 변수 값을 증가시키는 방법을 보여줍니다.

쓰레드 로컬 변수의 장점

쓰레드 로컬 변수의 가장 큰 장점은 쓰레드 간의 공유되지 않는 값을 효과적으로 유지할 수 있다는 것입니다. 또한 이는 동시에 여러 쓰레드에서 안전하게 값을 변경할 수 있는 유연성을 제공합니다.

쓰레드 로컬 변수와 메모리 누수

쓰레드 로컬 변수를 사용할 때 유의해야 하는 점은 메모리 누수입니다. 쓰레드 로컬 변수에 저장된 값은 해당 쓰레드가 종료되지 않는 이상 메모리에서 제거되지 않습니다. 이에 따라 쓰레드 풀 등 재사용되는 쓰레드를 사용하는 경우 메모리 누수에 주의해야 합니다.

결론

쓰레드 로컬 변수는 각각의 쓰레드에 고유한 값을 유지할 때 유용한 기술입니다. 안전하게 값을 유지하고 변경할 수 있으며, 쓰레드 간의 값 공유를 방지합니다.

참고문헌: Oracle Java Documentation - ThreadLocal