ThreadLocal

86 阅读1分钟

作用

ThreadLocal提供了线程内存储变量的能力,使每一个线程读取的变量是对应的互相独立的,同一个线程中读取的变量是一致的。

##源码解析

  1. 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);
    }
  1. 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;
            }
        }
}