ThreadLocal关系图

319 阅读1分钟

ThreadLcoal.get()会获取调用线程 的Entry的value。

 public T get() {
        Thread t = Thread.currentThread();
        // 获取当前线程的localMap
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            // 获取Entry, 键key就是当前threadlocal对象
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

说明

1、每个线程有自己的threadLocalMap变量

2、threadLocalMap中实际数据结构是Entry[]数组,Entry以threadlocal作为key值。

3、之所以使用Entry[]数组,是因为一个线程有可能关联多个threadlocal对象。