ThreadLocal
是什么
ThreadLocal
是一个泛型类,用于在线程中定义局部变量。官方的解释为:这个类提供线程的局部变量
TheadLocal
类不继承 Thread
类,也不实现 Runable
接口,ThreadLocal
类为每一个线程都维护了自己独有的变量;也就是说 ThreadLocal
中的变量属于当前线程,每个线程可以访问自己内部的变量
ThreadLocal
并不是用来解决多线程环境下的共享变量问题,而是用来提供线程内部的共享变量,在多线程环境下,可以保证各个线程之间的变量互相隔离、相互独立
ThreadLocal
的重要说明
ThreadLocalMap
说明
ThreadLocalMap
是 ThreadLocal
类中的一个静态内部类
ThreadLocalMap
内部定义了弱引用的数组 Entry
用来存放 key
和 value
,Entry
数组的默认容量为 16
,并且数组的容量必须为 2
的次幂
static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal<?>> {
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
private static final int INITIAL_CAPACITY = 16;
private Entry[] table;
private int size = 0;
private int threshold;
}
- 每个
Thread
维护了一个 ThreadLocalMap
映射表,这个映射表的 key
是ThreadLocal
实例本身。value
是真正需要存储的变量
ThreadLocal
本身并不存储值,它只是作为一个 key
来让线程从 ThreadLocalMap
中获取 value
。注意,ThreadLocalMap
是使用 ThreadLocal
的弱引用作为 key
的
Thread
类中的 threadLocals
变量
ThreadLocal.ThreadLocalMap threadLocals = null;
ThreadLocal
源码
ThreadLocal
中的 set()
方法
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)