자바 동시성-ThreadLocal 클래스

ThreadLocal 클래스는 동일한 스레드에서만 읽고 쓸 수있는 스레드 로컬 변수를 만드는 데 사용됩니다. 예를 들어, 두 스레드가 동일한 threadLocal 변수에 대한 참조가있는 코드에 액세스하는 경우 각 스레드는 다른 스레드에서 수행 한 threadLocal 변수에 대한 수정 사항을 볼 수 없습니다.

ThreadLocal 메서드

다음은 ThreadLocal 클래스에서 사용할 수있는 중요한 메서드 목록입니다.

Sr. 아니. 방법 및 설명
1

public T get()

이 스레드 로컬 변수의 현재 스레드 복사본에있는 값을 반환합니다.

2

protected T initialValue()

이 스레드 로컬 변수에 대한 현재 스레드의 "초기 값"을 반환합니다.

public void remove()

이 스레드 로컬 변수에 대한 현재 스레드의 값을 제거합니다.

4

public void set(T value)

이 스레드 로컬 변수의 현재 스레드 복사본을 지정된 값으로 설정합니다.

다음 TestThread 프로그램은 ThreadLocal 클래스의 이러한 메서드 중 일부를 보여줍니다. 여기서 우리는 두 개의 카운터 변수를 사용했습니다. 하나는 일반 변수이고 다른 하나는 ThreadLocal입니다.

class RunnableDemo implements Runnable {
   int counter;
   ThreadLocal<Integer> threadLocalCounter = new ThreadLocal<Integer>();

   public void run() {     
      counter++;

      if(threadLocalCounter.get() != null) {
         threadLocalCounter.set(threadLocalCounter.get().intValue() + 1);
      } else {
         threadLocalCounter.set(0);
      }
      System.out.println("Counter: " + counter);
      System.out.println("threadLocalCounter: " + threadLocalCounter.get());
   }
}

public class TestThread {

   public static void main(String args[]) {
      RunnableDemo commonInstance = new RunnableDemo();

      Thread t1 = new Thread(commonInstance);
      Thread t2 = new Thread(commonInstance);
      Thread t3 = new Thread(commonInstance);
      Thread t4 = new Thread(commonInstance);

      t1.start();
      t2.start();
      t3.start();
      t4.start();

      // wait for threads to end
      try {
         t1.join();
         t2.join();
         t3.join();
         t4.join();
      } catch (Exception e) {
         System.out.println("Interrupted");
      }
   }
}

그러면 다음과 같은 결과가 생성됩니다.

산출

Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0

카운터 값은 스레드마다 증가하지만 threadLocalCounter는 각 스레드에 대해 0으로 유지됩니다.