ThreadLocal用於保存線程的共享變量
變量的類型可以多樣,通過泛型來指定ThreadLocal<Object>
ThreadLocal有get、set、remove等函數,還有一個ThreadLocalMap內部類,這個是類是核心
代碼結構:
看ThreadLocal源碼,以set爲例
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
1:首先獲取當前線程;
2:getMap();getMap()是幹嘛的呢?進代碼發現是獲取當前線程的threadLocals變量,這個threadLocals變量是ThreadLocalMap類型的。說它是Map,其實並不是實現了Map接口,而是使用了Entry,完整是是一個Entry數組。
3:現在我們知道上面的map即threadLocals變量,在執行map.set(this,value);this即當前的ThreadLocal對象,值爲具體的value,key爲ThreadLocal對象。
所以,ThreadLocal的set(T)函數中,首先是拿到當前線程Thread對象中的ThreadLocalMap對象實例threadLocals ,然後再將需要保存的值保存到threadLocals裏面。換句話說,每個線程引用的ThreadLocal副本值都是保存在當前線程Thread對象裏面的。存儲結構爲ThreadLocalMap類型,ThreadLocalMap保存的鍵類型爲ThreadLocal,值爲副本值。
圖:java.lang.ThreadLocal.ThreadLocalMap#set,注意到參數爲ThreadLocal類型