Java의 ThreadLocal 개요
ThreadLocal
은 개발자가 각 실행 스레드에 특정한 변수를 생성할 수 있는 Java 언어의 강력한 도구입니다. 이는 각 스레드가 다른 스레드의 동일한 변수 값과 독립적으로 변수의 복사본을 가지고 있음을 의미합니다.
이는 서로 다른 스레드가 주어진 변수에 대해 서로 다른 요구 사항을 가질 수 있고 한 스레드의 변수 값에 대한 변경이 다른 스레드의 동일한 변수 값에 영향을 미치지 않아야 하는 다중 스레드 응용 프로그램에서 특히 유용합니다.
ThreadLocal
변수의 주요 용도
ThreadLocal
의 주요 사용 사례는 사용자 ID 또는 트랜잭션 ID와 같은 스레드별 상태를 저장하는 것입니다. 이 상태는 단일 요청에만 해당되며 서로 다른 요청 간에 공유되어서는 안 됩니다.
예를 들어 단일 데이터베이스 연결을 사용하여 여러 사용자 요청을 처리하는 웹 애플리케이션을 생각해 보십시오. ThreadLocal
이 없으면 여러 요청이 서로 다른 스레드에 의해 동시에 실행되고 서로 간섭할 수 있으므로 각 요청이 올바른 사용자 정보를 사용하는지 확인하기 어려울 것입니다.
ThreadLocal
을 사용하면 각 스레드는 해당 스레드와 연결된 데이터베이스 연결에서 사용되는 사용자 정보를 저장할 수 있습니다.
Java에서 ThreadLocal
을 사용하려면
Java에서 ThreadLocal
을 사용하려면 ThreadLocal
클래스의 새 인스턴스를 선언한 다음 해당 get()
및 set()
메서드를 사용하여 현재 스레드와 관련된 값에 액세스하고 수정합니다.
예를 들어, 다음 코드는 ThreadLocal
을 사용하여 각 스레드의 사용자 ID를 저장하는 방법을 보여줍니다.
public class Main {
public static void main(String args[]) {
ThreadLocal<Integer> localVariable = new ThreadLocal<>();
localVariable.set(10);
// get the value for the current thread
System.out.println("Value of localVariable in current thread: " + localVariable.get());
}
}
ThreadLocal
변수를 생성하면 변수에 액세스하는 각 스레드에는 별도의 변수 인스턴스가 있습니다. 즉, 각 스레드는 동일한 ThreadLocal
변수에 대해 다른 값을 저장할 수 있으며 변수에 액세스할 때 해당 특정 스레드에 대해 설정된 값을 가져옵니다.
이는 스레드 간에 공유해서는 안 되는 스레드별 데이터를 저장해야 하는 다중 스레드 환경에서 유용할 수 있습니다.
예를 들어 ThreadLocal
변수를 사용하여 특정 스레드에 대한 사용자 ID 또는 트랜잭션 ID와 같은 정보를 저장하여 여러 스레드가 동시에 실행 중인 경우에도 해당 스레드에 대한 데이터를 추적할 수 있습니다.
ThreadLocal
은 자신을 생성한 스레드가 종료될 때 해당 값을 자동으로 제거하지 않는다는 점에 유의해야 합니다. 종료된 스레드와 관련된 값이 계속 메모리를 차지하므로 이로 인해 메모리 누수가 발생할 수 있습니다.
이를 방지하려면 ThreadLocal
클래스의 remove()
메서드를 사용하거나 Java 7 이상에서 try-with-resources 문을 사용하는 것이 좋습니다. 예를 들어:
try (ThreadLocalCleanup cleanup = new ThreadLocalCleanup(userId)) {
// use the ThreadLocal variable here
}
이 예제에서 ThreadLocalCleanup
클래스는 AutoCloseable
인터페이스를 구현하여 try-with-resources 문과 함께 사용할 수 있습니다.
try-with-resources 문이 종료되면 ThreadLocalCleanup
클래스의 close()
메서드가 자동으로 호출되어 ThreadLocal
변수에서 현재 스레드와 연결된 값을 제거합니다.
위에서 언급한 코드의 작동을 확인하려면 여기를 클릭하십시오.
Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.
Facebook