public class ThreadLocal<T> extends Object
たとえば、次のクラスでは、各スレッドに対してローカルな一意の識別子が生成されます。スレッドの ID は、ThreadId.get() の最初の呼び出し時に割り当てられ、その後の呼び出しで変更されることはありません。
import java.util.concurrent.atomic.AtomicInteger; public class ThreadId { // Atomic integer containing the next thread ID to be assigned private static final AtomicInteger nextId = new AtomicInteger(0); // Thread local variable containing each thread's ID private static final ThreadLocal<Integer> threadId = new ThreadLocal<Integer>() { @Override protected Integer initialValue() { return nextId.getAndIncrement(); } }; // Returns the current thread's unique ID, assigning it if necessary public static int get() { return threadId.get(); } }
各スレッドは、スレッドが生存していて ThreadLocal インスタンスがアクセス可能である間は、スレッドローカル変数のコピーへの暗黙的な参照を保持します。スレッドが終了すると、スレッドローカルインスタンスのコピーは、すべてガベージコレクトされます (これらのコピーへの参照がほかに存在する場合を除く)。
コンストラクタと説明 |
---|
ThreadLocal()
スレッドローカル変数を作成します。
|
protected T initialValue()
get()
メソッドで最初にこの変数にアクセスしたときに呼び出されます。ただし、スレッドが以前に set(T)
メソッドを呼び出した場合を除きます。その場合、スレッドでは initialValue メソッドは呼び出されません。通常、このメソッドはスレッド当たり 1 回だけ呼び出されますが、後続の remove()
とそのあとの get()
の呼び出しの場合に、再度呼び出されることもあります。
この実装は、単に null を返すだけです。プログラマがスレッドローカル変数が null 以外の初期値を持つようにする場合、ThreadLocal をサブクラス化して、このメソッドをオーバーライドする必要があります。通常、匿名の内部クラスが使用されます。
public T get()
initialValue()
メソッドの呼び出しによって返される値に初期化されます。public void set(T value)
initialValue()
メソッドに大きく依存しているほとんどのサブクラスでは、このメソッドをオーバーライドする必要はありません。value
- このスレッドローカルの現行スレッドのコピーに格納される値。public void remove()
initialValue()
メソッドが呼び出されますが、その値が途中で現在のスレッドで設定された場合はそのかぎりではありません。その結果、現在のスレッドに initialValue メソッドの複数の呼び出しが生じることがあります。 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.