彻底理解ThreadLocal原理

最近准备找暑期实习,在看Java并发编程的艺术这本书,前面关于JMM的部分还是挺难的,看到第四章,终于进入了并发专题。突然出现了ThreadLocal这个类,一回忆,之前还用过这个类,使用ThreadLocal保存的值,只有在当前线程才可见。

下面介绍一下其实现原理:

首先进入ThreadLocal类,观察其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);
    }

首先获取到当前线程t,然后调用了getMap(t),得到一个ThreadLocalMap对象
于是继续追踪getMap()方法

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

getMap方法返回了t线程的threadLocals属性
进入Thread类

    ThreadLocal.ThreadLocalMap threadLocals = null;

threadLocals默认为null,所以set方法会调用createMap方法

    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

    ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
        table = new Entry[INITIAL_CAPACITY];
        int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
        table[i] = new Entry(firstKey, firstValue);
        size = 1;
        setThreshold(INITIAL_CAPACITY);
    }

可以发现在createMap方法中,创建了一个ThreadLocalMap对象,其中key为当前ThreadLocal对象,而这个ThreadLocalMap对象为当前Thread的属性

结论

至此,我们发现每个线程都有一个ThreadLocalMap属性,当前线程创建了ThreadLocal对象后,调用其set方法,会将其作为键存入ThreadLocalMap中。

你可能感兴趣的:(Java基础)