解決多執行緒共享變數衝突,採用空間換時間:每執行緒獨享副本,無需同步。
public class ThreadLocal {
// 取得當前執行緒的值,首次呼叫觸發 initialValue()
public T get() { ... }
// 設定當前執行緒的值
public void set(T value) { ... }
// 移除當前執行緒的值 (防洩漏)
public void remove() { ... }
// 子類別覆寫提供初始值
protected T initialValue() { return null; }
}
// Thread 內部
ThreadLocal.ThreadLocalMap threadLocals;
// ThreadLocalMap 簡化結構
static class ThreadLocalMap {
static class Entry extends WeakReference> {
Object value;
Entry(ThreadLocal> k, Object v) { super(k); value = v; }
}
private Entry[] table;
// 開放定址法處理碰撞
}
Key 為 ThreadLocal 弱參考,Value 為強參考。
public class RequestIdGenerator {
private static final ThreadLocal holder = new ThreadLocal() {
@Override protected Long initialValue() {
return System.nanoTime(); // 每執行緒獨立初始值
}
};
public static long get() { return holder.get(); }
public static void set(long id) { holder.set(id); }
public static void clear() { holder.remove(); }
}
| 場景 | 關鍵點 |
|---|---|
| 資料庫連線/Session | 每執行緒獨享 Connection,避免併發衝突 |
| Web 請求上下文 | Spring RequestContextHolder、用戶資訊、追蹤 ID |
| 非執行緒安全工具複用 | SimpleDateFormat、NumberFormat 等 |
| 事務管理 | Spring @Transactional 執行緒綁定事務狀態 |
| 序號/ID 生成器 | 每執行緒獨立計數器,無鎖高效能 |