public class ThreadLocal<T> extends Object
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
实例可以访问,每个线程都保存对其线程局部变量副本的隐式引用; 线程消失后,线程本地实例的所有副本都将被垃圾收集(除非存在对这些副本的其他引用)。
Constructor and Description |
---|
ThreadLocal()
创建线程局部变量。
|
Modifier and Type | Method and Description |
---|---|
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
方法将不会被调用。
通常情况下,这种方法最多每个线程调用一次,但它可能会再次在以后的调用的情况下调用remove()
其次是get()
。
这个实现简单地返回null
; 如果程序员希望线程局部变量具有除null
之外的初始值,则ThreadLocal
必须被子类化,并且该方法被覆盖。 通常,将使用匿名内部类。
public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier)
get
方法来Supplier
。
S
- 线程本地值的类型
supplier
- 用于确定初始值的供应商
NullPointerException
- 如果指定的供应商为空
public T get()
initialValue()
方法返回的值。
public void set(T value)
initialValue()
方法设置线程本地值的值。
value
- 要存储在当前线程的该线程本地的副本中的值。
public void remove()
initialValue()
方法重新初始化 ,除非其当前线程的值为set 。
这可能导致当前线程中的initialValue
方法的多次调用。