作用
ThreadLocal提供了线程内存储变量的能力,使每一个线程读取的变量是对应的互相独立的,同一个线程中读取的变量是一致的。
##源码解析
- threadLocal.set();
public void set(T value) {
Thread t = Thread.currentThread();
//1.通过线程获取ThreadLocalMap
ThreadLocalMap map = getMap(t);
if (map != null)
//theadLocal设置为key,当前值设为value
map.set(this, value);
else
createMap(t, value);
}
- TheadLocalMap
- ThreadLocalMap在Thread内部,就是说每个线程有自己的map
- ThreadLocalMap内部是Entry:存储的方式即为 key,value的键值对
- Entry继承弱引用 目的是防止内存泄露( Entry是弱引用,存储的key是强引用(ThreadLoacl tl = new ThreadLocal()),当key回收时(tl = null,如果是强引用key依然指向tl,tl无法回收),自动回收entry方式内存泄露);即使有弱引用依然存在内存泄露的情况:key回收后null指向value,导致value再也无法访问到,造成内存泄露,因此回收时要调研remove()
static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal<?>> {
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
}