public class ThreadLocal<T> extends Object
get
メソッドまたはset
メソッドを使ってアクセスするスレッドがそれぞれ独自に、変数の初期化されたコピーを持つという点で、通常の変数と異なります。通常、ThreadLocal
インスタンスは、状態をスレッドに関連付けようとするクラスでのprivate staticフィールドです(ユーザーID、トランザクションIDなど)。
たとえば、次のクラスでは、各スレッドに対してローカルな一意の識別子が生成されます。スレッドの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()
スレッド・ローカル変数を作成します。
|
修飾子と型 | メソッドと説明 |
---|---|
T |
get()
このスレッド・ローカル変数の現行スレッドのコピー内の値を返します。
|
protected T |
initialValue()
このスレッド・ローカル変数に対する現在のスレッドの「初期値」を返します。
|
void |
remove()
このスレッド・ローカル変数に対する現在のスレッドの値を削除します。
|
void |
set(T value)
このスレッド・ローカル変数の現在のスレッドのコピーを指定された値に設定します。
|
static <S> ThreadLocal<S> |
withInitial(Supplier<? extends S> supplier)
スレッド・ローカル変数を作成します。
|
protected T initialValue()
get()
メソッドで最初にこの変数にアクセスしたときに呼び出されます。ただし、スレッドが以前にset(T)
メソッドを呼び出した場合を除きます。その場合、スレッドではinitialValue
メソッドは呼び出されません。通常、このメソッドはスレッド当たり1回だけ呼び出されますが、後続のremove()
とその後のget()
の呼出しの場合に、再度呼び出されることもあります。
この実装は、単にnull
を返すだけです。プログラマがスレッド・ローカル変数がnull
以外の初期値を持つようにする場合、ThreadLocal
をサブクラス化して、このメソッドをオーバーライドする必要があります。通常、匿名の内部クラスが使用されます。
public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier)
Supplier
に対してget
メソッドを呼び出すことで決められます。S
- スレッド・ローカルの値の型supplier
- 初期値を決めるために使用されるサプライヤNullPointerException
- 指定されたサプライヤがnullである場合public T get()
initialValue()
メソッドの呼出しによって返される値に初期化されます。public void set(T value)
initialValue()
メソッドに大きく依存しているほとんどのサブクラスでは、このメソッドをオーバーライドする必要はありません。value
- このスレッド・ローカルの現行スレッドのコピーに格納される値。public void remove()
initialValue()
メソッドが呼び出されますが、その値が途中で現在のスレッドで設定された場合はそのかぎりではありません。その結果、現在のスレッドにinitialValue
メソッドの複数の呼出しが生じることがあります。 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.