Java의 ThreadLocal 개요

Muhammad Adil 2024년2월16일
  1. ThreadLocal 변수의 주요 용도
  2. Java에서 ThreadLocal을 사용하려면
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 avatar Muhammad Adil avatar

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

관련 문장 - Java Thread