ThreadLocal

ThreadLocal:线程内部的数据存储类。

1:我们看下这个类的内部有什么东西。


ThreadLocal1.png

2:关注ThreadLocal的几个方法
第一:get()
贴下源码

public T get() {
        //获取当前线程
        Thread t = Thread.currentThread();
       //拿到当前线程的ThreadLocalMap
        ThreadLocalMap map = getMap(t);
       //通过ThreadLocalMap获取当前ThreadLocal为key的value
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
      //如果当前线程的ThreadLocalMap没有被赋值过,那么就通过
     //setInitialValue()方法创建一ThreadLocalMap给于当前的线程
        return setInitialValue();
    }

setInitialValue()方法:说明一下这个方法只会被ThreadLocal的get方法调用,个人是这么理解的,就是我想要获取Thread的内部数据,但是发现这个Thread连放数据的容器都没有,那么我也不能白来一次,索性先给你个容器,虽然在set()方法里如果判断当前线程的ThreadLocalMap为null也会也会去createpMap,别让我知道你没有,知道你没有就给你造个塞给你

private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

set方法:看一哈就可以了

 public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

然后就是ThreadLocalMap这个东西,既然是个map就是个存数据的容器看ThreadLocal的getMap方法

ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }

他 是Thread里的,所以他存的数据就是当前线程的内部数据,看上面的set方法拿到当前线程的map后会把当前的ThreadLocal为key,然后吧value存在map里,value是个泛型,他是根据定义的ThreadLocal类的泛型为标准,像如果在looper类里的是ThreadLocal<Looper>,那么这个value就是looper,ActivityThread里的是ThreadLocal<Intent>,那么这个value就是Intent。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容