ThreadLocal是一個關(guān)于創(chuàng)建線程局部變量的類。使用ThreadLocal創(chuàng)建的變量是線程隔離的,其他線程則無法訪問和修改。開發(fā)過程中利用ThreadLocal可以比較方便的實現(xiàn)線程級別的局部變量,典型應(yīng)用:Spring MVC中的HttpServletRequest、SecurityContextHolder等。之前對于ThreadLocal只是知其然不知其所以然,本著求是的態(tài)度對ThreadLocal源碼做了進一步的解析。主要有幾個部分:簡單應(yīng)用實例,關(guān)鍵名詞及其關(guān)系,關(guān)鍵方法及其主要流程。
下面通過一個實例直觀感受下ThreadLocal實現(xiàn)的變量的線程隔離:


ThreadLocal、Thread以及ThreadLocalMap
三個ThreadLocal相關(guān)的關(guān)鍵名詞的相互關(guān)系為:每一個Thread中都有一個ThreadLocalMap存儲線程級別變量,ThreadLocalMap的key為定義的同一個ThreadLocal變量。ThreadLocal雖然只有一個并且在Thread之間貢獻但是卻可以從不同的Thread中取出不同的值的秘訣就在于此:key雖然是同一個但是Map卻不相同。
ThreadLocal方法主要是set,get,remove以及initial,
? ? set:首先從Thread中拿到ThreadLocalMap,判斷ThreadLocalMap是否為空如果不為空以當(dāng)前ThreadLocal作為Key存入ThreadLocal,如果為空創(chuàng)建map然后存儲value。

get,remove也是一樣,先從當(dāng)前線程拿到相應(yīng)map再做相關(guān)操作。
getMap:實現(xiàn)真的超級簡單:

另外ThreadLocal還提供了一些諸如createInheritedMap、withInitial等相關(guān)方便操作的方法。有興趣的同學(xué)可以研究。