ThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的值。可以通过set(T)方法来设置一个值,在当前线程下在通过get()方法获取到原先设置的值。
首先来看下set方法,基于JDK8
/**
* 将此线程局部变量的当前线程副本设置为指定值。大多数子类不需要重新此方法,
* 仅依靠initialValue方法来设置线程局部变量的值
*
* @param value the value to be stored in the current thread's copy of
* this thread-local.
*/
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
/**
* 获取与ThreadLocal关联的map,在InheritableThreadLocal中重写
*
* @param t the current thread
* @return the map
*/
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
在set方法中,首先获取当前线程,然后获取当前线程关联的ThreadLocalMap,而ThreadLocalMap是ThreadLocal类中定义的一个结构。ThreadLocalMap的部分源码如下:
static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
}
其在ThreadLocalMap中定义了一个Entry对象用来存储我们在set方法中方的值。