查看ThreadLocal的源碼,大體上可以劃分爲ThreadLocal、Thread、ThreadLocalMap這三個類,所以主要分析一下這三個類的聯繫。
Thread
Thread是線程類,通過Thread.currentThread()方法可以獲取當前線程,並且Thread維護一個ThreadLocalMap成員變量用於存儲線程私有變量(ThreadLocal.ThreadLocalMap threadLocals = null;)
ThreadLocalMap
ThreadLocalMap,作爲ThreadLocal的靜態內部類,類似map結構,內部維護一個Entry[]數組,Entry類存儲key、value鍵值對。這個map是主要用來存儲線程私有變量的。
設值時先根據當前ThreadLocal計算出應該存儲在Entry[]中的位置,即數組下標。如果當前下標已存在值,則覆蓋value,不存在則設置Entry(key,value)存儲在當前下標。
取值時先根據當前ThreadLocal計算出在Entry[]數組中存儲的位置即下標。然後根據下標取出Entry,然後得到Entry.value。
ThreadLocal
ThreadLocal是入口,相當於一個工具類,提供了一些方法通過ThreadLocal.set()、get() 方法可以直接操作當前線程的ThreadLocalMap。