java.lang.Object
java.lang.ThreadLocal<T>
- 类型参数:
T- 线程本地值的类型
- 已知子类:
InheritableThreadLocal
此类提供线程局部变量。这些变量与它们的普通对应变量的不同之处在于,每个访问一个变量的线程(通过其
get 或 set 方法)都有自己的、独立初始化的变量副本。 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
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述get()返回此线程局部变量的当前线程副本中的值。protected T返回此线程局部变量的当前线程的“初始值”。voidremove()删除此线程局部变量的当前线程值。void将此线程局部变量的当前线程副本设置为指定值。static <S> ThreadLocal<S>withInitial(Supplier<? extends S> supplier) 创建线程局部变量。
-
构造方法详细信息
-
ThreadLocal
public ThreadLocal()创建线程局部变量。- 参见:
-
-
方法详情
-
initialValue
返回此线程局部变量的当前线程的“初始值”。此方法将在线程第一次使用get()方法访问变量时调用,除非线程先前调用了set(T)方法,在这种情况下不会为该线程调用initialValue方法。通常,每个线程最多调用一次此方法,但在后续调用remove()后跟get()的情况下可能会再次调用它。此实现仅返回
null;如果程序员希望线程局部变量具有null以外的初始值,则必须对ThreadLocal进行子类化,并覆盖此方法。通常,将使用匿名内部类。- 返回:
- 此线程本地的初始值
-
withInitial
创建线程局部变量。变量的初始值通过调用Supplier上的get方法来确定。- 类型参数:
S- 线程本地值的类型- 参数:
supplier- 用于确定初始值的供应商- 返回:
- 一个新的线程局部变量
- 抛出:
NullPointerException- 如果指定的供应商为空- 自从:
- 1.8
-
get
返回此线程局部变量的当前线程副本中的值。如果该变量对于当前线程没有值,则首先将其初始化为调用initialValue()方法返回的值。如果当前线程不支持线程局部变量,则此方法返回其initialValue()(如果initialValue方法未被覆盖,则返回null)。- 返回:
- 此线程局部的当前线程值
- 参见:
-
set
将此线程局部变量的当前线程副本设置为指定值。大多数子类不需要重写此方法,仅依赖initialValue()方法来设置线程局部变量的值。- 参数:
value- 要存储在此线程本地的当前线程副本中的值。- 抛出:
UnsupportedOperationException- 如果不允许当前线程设置其线程局部变量的副本- 参见:
-
remove
public void remove()删除此线程局部变量的当前线程值。如果此线程局部变量随后被当前线程 read 调用,则其值将通过调用其initialValue()方法重新初始化,除非其值在此期间被当前线程变为 set 。这可能会导致在当前线程中多次调用initialValue方法。- 自从:
- 1.5
-