java.lang.Object
java.lang.ThreadLocal<T>
- 直系の既知のサブクラス:
InheritableThreadLocal
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
インスタンスがアクセス可能である間は、スレッド・ローカル変数のコピーへの暗黙的な参照を保持します。スレッドが終了すると、スレッド・ローカル・インスタンスのコピーは、すべてガベージ・コレクトされます(これらのコピーへの参照がほかに存在する場合を除く)。
- 導入されたバージョン:
- 1.2
-
コンストラクタのサマリー
コンストラクタ -
メソッドのサマリー
修飾子と型メソッド説明get()
このスレッド・ローカル変数の現行スレッドのコピー内の値を返します。protected T
このスレッド・ローカル変数に対する現在のスレッドの「初期値」を返します。void
remove()
このスレッド・ローカル変数に対する現在のスレッドの値を削除します。void
このスレッド・ローカル変数の現在のスレッドのコピーを指定された値に設定します。static <S> ThreadLocal<S>
withInitial
(Supplier<? extends S> supplier) スレッド・ローカル変数を作成します。
-
コンストラクタの詳細
-
ThreadLocal
public ThreadLocal()スレッド・ローカル変数を作成します。
-
-
メソッドの詳細
-
initialValue
protected T initialValue()このスレッド・ローカル変数に対する現在のスレッドの「初期値」を返します。 このメソッドは、スレッドがget()
メソッドで最初にこの変数にアクセスしたときに呼び出されます。ただし、スレッドが以前にset(T)
メソッドを呼び出した場合を除きます。その場合、スレッドではinitialValue
メソッドは呼び出されません。 通常、このメソッドはスレッド当たり1回だけ呼び出されますが、後続のremove()
とその後のget()
の呼出しの場合に、再度呼び出されることもあります。この実装は、単に
null
を返すだけです。プログラマがスレッド・ローカル変数がnull
以外の初期値を持つようにする場合、ThreadLocal
をサブクラス化して、このメソッドをオーバーライドする必要があります。 通常、匿名の内部クラスが使用されます。- 戻り値:
- このスレッド・ローカルの初期値
-
withInitial
public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier) スレッド・ローカル変数を作成します。 その変数の初期値は、Supplier
に対してget
メソッドを呼び出すことで決められます。- 型パラメータ:
S
- スレッド・ローカルの値の型- パラメータ:
supplier
- 初期値を決めるために使用されるサプライヤ- 戻り値:
- 新しいスレッド・ローカル変数
- 例外:
NullPointerException
- 指定されたサプライヤがnullである場合- 導入されたバージョン:
- 1.8
-
get
public T get()このスレッド・ローカル変数の現行スレッドのコピー内の値を返します。 この変数が現在のスレッドの値を持たない場合は、まず、initialValue()
メソッドの呼出しによって返される値に初期化されます。- 戻り値:
- このスレッド・ローカルの現行スレッドの値
-
set
public void set(T value) このスレッド・ローカル変数の現在のスレッドのコピーを指定された値に設定します。 スレッド・ローカルの値を設定するのにinitialValue()
メソッドに大きく依存しているほとんどのサブクラスでは、このメソッドをオーバーライドする必要はありません。- パラメータ:
value
- このスレッド・ローカルの現行スレッドのコピーに格納される値。
-
remove
public void remove()このスレッド・ローカル変数に対する現在のスレッドの値を削除します。 その後、現在のスレッドでこのスレッド・ローカル変数の読み取りが行われた場合、その値を再度初期化するために、initialValue()
メソッドが呼び出されますが、その値が途中で現在のスレッドで設定された場合はそのかぎりではありません。 その結果、現在のスレッドにinitialValue
メソッドの複数の呼出しが生じることがあります。- 導入されたバージョン:
- 1.5
-