这个问题是面试经常被问的问题,其实要搞清楚这个问题,我们首先要好好理解ThreadLocal和Thread以及ThreadLocalMap的关系。
ThreadLocalMap是什么,首先我们用Ide工具找个找到它的位置。搜索发现,它其实是定义在Thread类中。
image-20220516185612535.png
我们接着去寻找使用到它的地方,通过Ide跳转,我们可以发现我们来到了ThreadLocal类的createMap()方法,我们可以发现这个方法其实是新建了一个ThreadLocalMap ,而ThreadLocalMap的key是this,也就是当前ThreadLocal对象。接着,让我们来找一找什么时候用到了createMap()方法
image-20220516190945013.png
通过查找,我们可以发现在setInitialValue()和set()两个方法中对createMap进行了调用。通过阅读源码以及我们平时的使用,可以很容易的发现,这两个方法其实就是我们初始化ThreadLocal内容时使用的方法
image-20220516191616025.png
经过以上简单的跟踪源码,我们可以得出结论,每一个线程包括了一个ThreadLocalMap,而ThreadLocalMap存储了我们创建的多个ThreadLocal,每一个ThreadLocalMap值的key就是当前的ThreadLocal。所以ThreadLocal其实是没有Key的,这里的key指的的是ThreadLocalMap的key,也就是当前的ThreadLocal。