Thread类源代码⼊⼿。

public class Thread implements Runnable {
    ......
    //与此线程有关的ThreadLocal值。由ThreadLocal类维护
    ThreadLocal.ThreadLocalMap threadLocals = null;
    //与此线程有关的InheritableThreadLocal值。由InheritableThreadLocal类维护
    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
    ......
}

从上⾯Thread类源代码可以看出,Thread类中有⼀个threadLocals和⼀个inheritableThreadLocals变量,它们都是ThreadLocalMap类型的变量,我们可以把ThreadLocalMap理解为ThreadLocal类实现的定制化的HashMap。默认情况下这两个变量都是null,只有当前线程调⽤ThreadLocal类的setget⽅法时才创建它们,实际上调⽤这两个⽅法的时候,我们调⽤的是ThreadLocalMap类对应的get()set()⽅法。

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);
}
ThreadLocalMap getMap(Thread t) {
    return t.threadLocals;
}

通过上⾯这些内容,我们⾜以通过猜测得出结论:最终的变量是放在了当前线程的ThreadLocalMap中,并不是存在ThreadLocal上,ThreadLocal可以理解为只是ThreadLocalMap的封装,传递了变量值。ThrealLocal类中可以通过Thread.currentThread()获取到当前线程对象后,直接通过getMap(Thread t)可以访问到该线程的ThreadLocalMap对象。

ThreadLocal内部维护的是⼀个类似MapThreadLocalMap数据结构,key为当前对象的Thread对象,值为Object对象。

ThreadLocalMap(ThreadLocal << ? > firstKey, Object firstValue) {
    ......
}

⽐如我们在同⼀个线程中声明了两个ThreadLocal对象的话,都是使⽤Thread内部仅有的那个ThreadLocalMap存放数据的,ThreadLocalMapkey就是ThreadLocal对象,value就是ThreadLocal对象调⽤set⽅法设置的值。

ThreadLocalMapThreadLocal的静态内部类。
file

最后修改日期: 2021年11月29日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。