原理
ThreadLocal实际起作用的是ThreadLocal内部的ThreadLocalMap类,对于每一个Tread,都有一个ThreadLocalMap属性,从而实现线程隔离,然后set的时候就通过获取当前线程然后给他的ThreadLcoalMap属性添加值
public
class Thread implements Runnable {
ThreadLocal.ThreadLocalMap threadLocals = null;
}
ThreadLocalMap
static class ThreadLocalMap {
/**
* The entries in this hash map extend WeakReference, using * its main ref field as the key (which is always a * ThreadLocal object). Note that null keys (i.e. entry.get() * == null) mean that the key is no longer referenced, so the * entry can be expunged from table. Such entries are referred to * as "stale entries" in the code that follows. */
// Entry是节点,继承了WeakReferentce,定义了一个value
static class Entry extends WeakReference<ThreadLocal<?>> {
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
public void set(T value) {
// 获取当前线程
Thread t = Thread.currentThread();
// 通过当前线程获取线程中维护的ThreadLocalMap对象
ThreadLocalMap map = getMap(t);
if (map != null) {
map.set(this, value);
} else {
createMap(t, value);
}
}
}
为何使用弱引用
因为ThreadLocalMap的key是Thread,如果像普通的key-value的定义,只要线程未销毁
就会一直存在,所以使用弱引用就可以在不存在强引用的时候就将这个销毁。