认识ThreadLocal
此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个(通过其 get 或 set 方法)的线程都有自己的、独立初始化的变量副本。 ThreadLocal 实例通常希望是那些将状态与线程相关联的类中的私有静态字段(例如,用户 ID 或事务 ID)。
例如,下面的类生成每个线程本地的唯一标识符。线程的 id 在第一次调用 ThreadId.get() 时被分配,并且在后续调用中保持不变。
导入 java.util.concurrent.atomic.AtomicInteger;
公共类线程 ID {
// 包含要分配的下一个线程 ID 的原子整数
private static final AtomicInteger nextId = new AtomicInteger(0);
// 包含每个线程 ID 的线程局部变量
私有静态最终 ThreadLocal threadId =
新线程本地<整数>(){
@Override 受保护的整数 initialValue() {
返回 nextId.getAndIncrement();
}
};
// 返回当前线程的唯一 ID,必要时分配它
公共静态 int get() {
返回 threadId.get();
}
}
只要线程处于活动状态并且可以访问 ThreadLocal 实例,每个线程都会持有对其线程局部变量副本的隐式引用;线程消失后,它的所有线程本地实例副本都将进行垃圾回收(除非存在对这些副本的其他引用)。
public class ThreadLocal<T>{
ThreadLocals 依赖于附加到每个线程(Thread.threadLocals 和inheritableThreadLocals)的每线程线性探针哈希映射。 ThreadLocal 对象充当键,通过 threadLocalHashCode 进行搜索。 这是一个自定义哈希代码(仅在 ThreadLocalMaps 中有用),它消除了在相同线程使用连续构造的 ThreadLocals 的常见情况下的冲突,同时在不太常见的情况下保持良好的行为。
private final int threadLocalHashCode = nextHashCode();
}