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


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

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

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