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のままです。