ThreadLocal的官方文档
Class ThreadLocal<T>
java.lang.Object
java.lang.ThreadLocal<T>
直接子类:
InheritableThreadLocal
public class ThreadLocal<T> extends Object
该类提供了线程局部变量。这些变量不同于那些正常的变量,正常的变量是每个线程通过调用get或set方法访问的是同一个。而对于线程局部变量来说,每个线程都有它自己的、独立的初始化副本。ThreadLocal在类中通常都是一些私有的静态变量,它把状态变量和线程关联在一起。(例如,用户ID、事务ID)。
例如,下面的这个类会为每个线程生成一个唯一的标识符。在第一次调用ThreadId.get()方法的时候,就会为线程分配一个线程ID,并在后续的调用中保持不变。
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实例的副本都交由垃圾回收器处理(除非,还有对这些副本的引用)。
构造方法
ThreadLocal() // 创建一个线程局部变量
方法总结
|修饰符和数据类型 |方法 | 描述 |
|:----- |:------|:----------------------------- |
|T | get() | 返回此ThreadLocal变量在当前线程中的副本 |
|protected T | initialValue() | 返回当前线程的ThreadLocal的初始值 |
|void | remove() | 移除当前线程的TreadLocal中的值 |
|void | set(T value ) | 把当前线程的ThreadLocal副本设置为指定的值|
|static <S> ThreadLocal<S> | withInitial(Supplier<? extends S> supplier) | 创建一个ThreadLocal变量 |
方法详情
1、构造方法详情
public ThreadLocal()
描述:
创建一个ThreadLocal实例。
2、initialValue方法
返回当前线程的ThreadLocal的初始值。在线程第一次通过get()方法访问变量的时候,会调用此方法,除非此线程之前调用过set方法(在这种情况下,即:如果线程之前调用过set方法,那么在第一次访问get()方法的时候,不会调用initialValue方法)。正常情况下,每一个线程只会调用一次initialValue方法,但是如果在调用remove()方法之后,又调用了get()方法的话,还会再次调用initialValue()方法。
该实现会返回null。如果编程者想让ThreadLocal变量拥有一个初始值的话,那么就必须自定义一个ThreadLocal的子类,并重写initialValue方法。我们通常都是直接使用匿名内部类。
3、withInitial方法
方法描述:
创建一个ThreadLocal变量,变量的初始值取决于Supplier的get方法调用。
类型参数:
S - 线程局部变量的值的数据类型。
supplier - supplier用于确定初始值
返回值:
一个新的线程局部变量
Throws:
NullPointerException - 如果指定的supplier为null的话,将返回NullPointerException
4、get方法
方法描述:
返回当前线程的线程局部变量的副本。如果此线程的实例没有值的话,它会用initialValue()方法的返回值进行初次初始化。
返回值:
返回当前线程的ThreadLocal实例的副本。
5、set方法
方法描述:
把当前线程的线程局部变量的副本设置为指定值。大多数子类不用重写此方法,只需要依赖initialValue()方法设置线程局部变量的值即可。
6、remove方法
方法描述:
移除当前线程的线程局部变量的值。如果此线程后面又读取线程局部变量的值,会再次调用initialValue()方法对该线程的线程局部变量进行再次初始化,除非在此期间,当前线程重置了
该值。remove操作可能导致在当前线程中多次调用initialValue方法。
备注
官方文档地址
网友评论