首先,咱們從名字上來看就是線程本地的意思,能夠想到在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方法(理解不夠透徹)