モジュール java.base
パッケージ 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
    • コンストラクタのサマリー

      コンストラクタ 
      コンストラクタ 説明
      ThreadLocal()
      スレッド・ローカル変数を作成します。
    • メソッドのサマリー

      修飾子と型 メソッド 説明
      T get()
      このスレッド・ローカル変数の現行スレッドのコピー内の値を返します。
      protected T initialValue()
      このスレッド・ローカル変数に対する現在のスレッドの「初期値」を返します。
      void remove()
      このスレッド・ローカル変数に対する現在のスレッドの値を削除します。
      void set​(T value)
      このスレッド・ローカル変数の現在のスレッドのコピーを指定された値に設定します。
      static <S> ThreadLocal<S> withInitial​(Supplier<? extends S> supplier)
      スレッド・ローカル変数を作成します。
    • メソッドの詳細

      • 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