ThreadLocal 提供線程局部變量,每個線程擁有獨立副本,互不干擾,是解決多線程環境下「線程安全」與「參數傳遞」的利器。
每個 Thread 內部持有一個 ThreadLocalMap,Key 為 ThreadLocal 實例(弱引用),Value 為線程專屬值。set() / get() 實際操作的是當前線程的 Map。
private static final ThreadLocal<String> TL = new ThreadLocal<>();
public static void main(String[] args) {
TL.set("nihao"); // 當前線程存入
System.out.println(TL.get()); // 輸出: nihao
TL.remove(); // 手動清理,防內存洩漏
System.out.println(TL.get()); // 輸出: null
}
TransactionSynchronizationManager)。SimpleDateFormat、Random 等實例化開銷大且非線程安全,ThreadLocal 實現復用。finally 中清理。remove() 及 ThreadLocalMap 探測式清理機制緩解。// ThreadLocalMap.Entry 繼承 WeakReference<ThreadLocal<?>>
static class Entry extends WeakReference<ThreadLocal<?>> {
Object value;
Entry(ThreadLocal<?> k, Object v) { super(k); value = v; }
}
// 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);
}
理解底層原理,方能在高併發系統中穩健落地 ThreadLocal。