首先,咱们从名字上来看就是线程本地的意思,能够想到在ThreadLocal内的都是独属于线程自己。实际也是如此,ThreadLocal对象能够提供线程局部变量,ThreadLocal为变量在每一个线程中都建立了一个副本,每一个线程能够访问本身内部的副本变量。这也意味着多个线程之间互不干扰。算法
通常而言,看一个对象先从构造方法开始,可是ThreadLocal的构造方法为空实现。数组
那咱们稍微思考一下,既然是储存变量,那么重点就该是查询、增长、删除的方法,分别对应着:get(),set(),remove()方法。spa
get()方法
使用逻辑仍是很清晰的,接着看下setInitialValue()方法线程
initialValue()方法是子类重写的方法(),当没有entity的时候,就在这里初始化赋值。对象
当map为空时,则将初始化Map,并将其设置为第一个Entry。若是是Entry为空,则设置Entry。blog
如下是建立map的方法:内存
set()方法
简单明了的逻辑,map不为空,则直接设置。若是为空,则建立一个Map。开发
remove() 方法
看了三个方法 都与ThreadLocalMap有着深厚的联系,那么接下来就看看这个类吧。rem
为何不用HashMap,而是新建一个类呢?
基础信息
resize方法
当扩容达到阈值以后,会触发rehash方法,先清除一轮过时数据,若是清理数据后,数据容量为阈值的3/4,则开启resize方法。get
resize方法,新建一个数组,将旧数组的从新rehash以后,一一放入后,最后更新引用。并从新计算阈值
get方法
如今就分为两种状况
碰到null,则开始探测式清理过时逻辑。(这个算是这个类的重要的一个功能)简要的介绍一下流程
set方法(理解不够透彻)