模块 java.base
 java.lang

类 ThreadLocal<T>

java.lang.Object
java.lang.ThreadLocal<T>
类型参数:
T - 线程本地值的类型
已知子类:
InheritableThreadLocal

public class ThreadLocal<T> extends Object
此类提供线程局部变量。这些变量与它们的普通对应变量的不同之处在于,每个访问一个变量的线程(通过其 getset 方法)都有自己的、独立初始化的变量副本。 ThreadLocal 实例通常是希望将状态与线程相关联的类中的私有静态字段(例如,用户 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
  • 构造方法总结

    构造方法
    构造方法
    描述
    创建线程局部变量。
  • 方法总结

    修饰符和类型
    方法
    描述
    T
    get()
    返回此线程局部变量的当前线程副本中的值。
    protected T
    返回此线程局部变量的当前线程的“初始值”。
    void
    删除此线程局部变量的当前线程值。
    void
    set(T value)
    将此线程局部变量的当前线程副本设置为指定值。
    static <S> ThreadLocal<S>
    withInitial(Supplier<? extends S> supplier)
    创建线程局部变量。

    在类 java.lang.Object 中声明的方法

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 构造方法详细信息

  • 方法详情

    • initialValue

      protected T  initialValue()
      返回此线程局部变量的当前线程的“初始值”。此方法将在线程第一次使用 get() 方法访问变量时调用,除非线程先前调用了 set(T) 方法,在这种情况下不会为该线程调用 initialValue 方法。通常,每个线程最多调用一次此方法,但在后续调用 remove() 后跟 get() 的情况下可能会再次调用它。

      此实现仅返回 null ;如果程序员希望线程局部变量具有 null 以外的初始值,则必须对 ThreadLocal 进行子类化,并覆盖此方法。通常,将使用匿名内部类。

      返回:
      此线程本地的初始值
    • withInitial

      public static <S> ThreadLocal <S> withInitial(Supplier <? extends S> supplier)
      创建线程局部变量。变量的初始值通过调用 Supplier 上的 get 方法来确定。
      类型参数:
      S - 线程本地值的类型
      参数:
      supplier - 用于确定初始值的供应商
      返回:
      一个新的线程局部变量
      抛出:
      NullPointerException - 如果指定的供应商为空
      自从:
      1.8
    • get

      public T  get()
      返回此线程局部变量的当前线程副本中的值。如果该变量对于当前线程没有值,则首先将其初始化为调用 initialValue() 方法返回的值。如果当前线程不支持线程局部变量,则此方法返回其 initialValue() (如果 initialValue 方法未被覆盖,则返回 null)。
      返回:
      此线程局部的当前线程值
      参见:
    • set

      public void set(T  value)
      将此线程局部变量的当前线程副本设置为指定值。大多数子类不需要重写此方法,仅依赖initialValue() 方法来设置线程局部变量的值。
      参数:
      value - 要存储在此线程本地的当前线程副本中的值。
      抛出:
      UnsupportedOperationException - 如果不允许当前线程设置其线程局部变量的副本
      参见:
    • remove

      public void remove()
      删除此线程局部变量的当前线程值。如果此线程局部变量随后被当前线程 read 调用,则其值将通过调用其 initialValue() 方法重新初始化,除非其值在此期间被当前线程变为 set 。这可能会导致在当前线程中多次调用 initialValue 方法。
      自从:
      1.5