大白话讲解ThreadLocal的原理

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_30698633/article/details/77123728

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);
    }
通过源码我们可以发现,首先获取了当前线程,然后调用getMap方法,将当前线程传了进去,返回了ThreadLocalMap。我们先来看一下getMap

方法。

ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
嗯??返回了当前线程的threadLocals,所以我们知道了,原来ThreadLocalMap是当前线程的一个变量的类型,所以这个threadLocals是线程自己

本身就有的东西,属于Thread。

然后再看set方法,当map不为空,将this即ThreadLocal当key,这里也许有同学不理解了,为什么要将ThreadLocal当key呢?

因为我们不一定就一个ThreadLocal,有可能有多个,而threadLocals是线程自己本身的,如果有多个ThreadLocal,也就是有

多个值需要存储到threadLocals中,我们就可以通过ThreadLocal来取出不同的信息。

还是有点迷糊??

其实说白了就是,每一个Thread线程都拥有自己的一个类型为ThreadLocalMap,名称为threadLocals的局部变量,就像名字表达的这样,这个变量可以

以ThreadLocal为key进行存储自己的信息。而ThreadLocal其实就是为了使我们操作threadLocals变量更加方便,而封装的一个类。使用ThreadLocal和

我们直接自己定义线程的局部变量都一样,只是使用ThreadLocal使我们的代码更加优雅,简洁。我们不用关注线程,只需要操作ThreadLocal就可以取得

该线程自己的变量


   上面是我根据自己的理解画的图,如果不对,请及时指正。

展开阅读全文

没有更多推荐了,返回首页