ThreadLocal,即線程變量,是一個以ThreadLocal對象為鍵,任意對象為值的存儲結構。這個結構被附帶在線程上,也就是說一個線程可以根據一個ThreadLocal對象查詢到綁定在這個線程上的值。可以通過set(T)方法來設置一個值,在當前線程下在通過get()方法獲取到原先設置的值。
首先來看下set方法,基于JDK8
/*** 將此線程局部變量的當前線程副本設置為指定值。大多數子類不需要重新此方法,* 僅依靠initialValue方法來設置線程局部變量的值** @param value the value to be stored in the current thread's copy of* this thread-local.*/public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);}/*** 獲取與ThreadLocal關聯的map,在InheritableThreadLocal中重寫** @param t the current thread* @return the map*/ThreadLocalMap getMap(Thread t) {return t.threadLocals;}
在set方法中,首先獲取當前線程,然后獲取當前線程關聯的ThreadLocalMap,而ThreadLocalMap是ThreadLocal類中定義的一個結構。ThreadLocalMap的部分源碼如下:
static class ThreadLocalMap {static class Entry extends WeakReference<ThreadLocal<?>> {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}}
}
其在ThreadLocalMap中定義了一個Entry對象用來存儲我們在set方法中方的值。
ThreadLocal介紹