Javaの並行性-ThreadLocalクラス

ThreadLocalクラスは、同じスレッドでのみ読み取りと書き込みができるスレッドローカル変数を作成するために使用されます。たとえば、2つのスレッドが同じthreadLocal変数を参照するコードにアクセスしている場合、各スレッドは他のスレッドによって行われたthreadLocal変数への変更を認識しません。

ThreadLocalメソッド

以下は、ThreadLocalクラスで使用可能な重要なメソッドのリストです。

シニア番号 方法と説明
1

public T get()

このスレッドローカル変数の現在のスレッドのコピーの値を返します。

2

protected T initialValue()

このスレッドローカル変数の現在のスレッドの「初期値」を返します。

3

public void remove()

このスレッドローカル変数の現在のスレッドの値を削除します。

4

public void set(T value)

このスレッドローカル変数の現在のスレッドのコピーを指定された値に設定します。

次のTestThreadプログラムは、ThreadLocalクラスのこれらのメソッドのいくつかを示しています。ここでは、2つのカウンター変数を使用しました。1つは正規変数で、もう1つは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のままです。