经过源码解读ThreadLocal类的实现this
ThreadLocal类提供了如下几个方法spa
首先咱们来看一下ThreadLocal是如何为每一个线程建立一个变量副本的:线程
第160行,获取当前线程对象实例对象
第161行,经过当前线程对象实例获取一个ThreadLocalMap,这个map是ThreadLocal类的一个内部静态类,blog
若是map不为空接着获取map中的entry,继承
这里获取键值对传进去的是 this,而不是当前线程trem
若是获取成功,则返回value值get
若是map为空,则调用setInitialValue方法返回value源码
咱们上面的每一句来仔细分析:it
首先看一下getMap方法中作了什么?
在getMap中,是调用当期线程t,返回当前线程t中的一个成员变量threadLocals。
那么咱们继续取Thread类中取看一下成员变量threadLocals是什么:
实际上就是一个ThreadLocalMap,这个类型是ThreadLocal类的一个内部类,咱们继续取看ThreadLocalMap的实现:
能够看到ThreadLocalMap的Entry继承了WeakReference,而且使用ThreadLocal做为键值。
而后再继续看setInitialValue方法的具体实现:
很容易了解,就是若是map不为空,就设置键值对,为空,再建立Map,看一下createMap的实现:
以上源码就能够看出:
首先在每一个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来存储实际变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。
初始时,在Thread里面,threadLocals为空,当经过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,而且以当前ThreadLocal变量为键值,以ThreadLocal要保存的副本变量为value,存到threadLocals。