ThreadLocal

来源:互联网 发布:java认证培训 编辑:程序博客网 时间:2024/06/12 23:31

ThreadLocal 是把对象交给当前线程管理。

每个Thread里有个ThreadLocalMap,内部为Entry数组,每个Entry的key为一个ThreadLocal实例,value为需要管理的对象。所以交给ThreadLocal管理的对象只与当前线程有关。


1、ThreadLocal的set方法

    public void set(T value) {        // 获取当前线程        Thread t = Thread.currentThread();        // 每个Thread 内部维护一个ThreadLocalMap        // 每个ThreadLocalMap内部维护一个Entry        // Entry的 key为 ThreadLocal,value 为一个Object        ThreadLocalMap map = getMap(t);        if (map != null)            // 当前线程的ThreadLocalMap 已经存在            // this 代表当前的 ThreadLocal对象            // 每个 ThreadLocalMap 会有很多ThreadLocal            // 所以Thread 是通过ThreadLocalMap 管理ThreadLocal 和他对应的Object            map.set(this, value);        else            // 实例化当前线程的ThreadLocalMap,并把ThreadLocal 和 对象放进去            createMap(t, value);    }

2、ThreadLocal的get方法

    public T get() {        // 获取当前线程        Thread t = Thread.currentThread();        // 获取当前线程的 ThreadLocalMap        ThreadLocalMap map = getMap(t);        if (map != null) {            // 获取存放当前ThreadLocal 的Entity            ThreadLocalMap.Entry e = map.getEntry(this);            if (e != null) {                // 取得ThreadLocal 对应的Object                T result = (T) e.value;                return result;            }        }        // 初始化ThreadLocal, 设对应的Object为null        return setInitialValue();    }    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;    }    protected T initialValue() {        return null;    }


原创粉丝点击