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, 2025, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyも参照してください。