ThreadLocal 原理与线程上下文传递
ThreadLocal 是什么 ThreadLocal 用于保存线程私有变量。 同一个 ThreadLocal 可以被多个线程访问,但每个线程读取和修改的都是自己保存的值,线程之间默认互不影响。 常见用途包括: 保存当前用户信息; 保存 TraceId; 保存租户或请求上下文; 在线程内部隐式传递参数。 private static final ThreadLocal<String> USER_CONTEXT = new ThreadLocal<>(); 调用 set() 时,数据并不是直接存入 ThreadLocal 对象,而是存入当前线程内部的 ThreadLocalMap: Thread └── ThreadLocalMap ├── ThreadLocal A → Value A └── ThreadLocal B → Value B 一个线程可以使用多个 ThreadLocal,但这些数据都保存在当前线程自己的 ThreadLocalMap 中。 ThreadLocal 为什么会内存泄漏 ThreadLocalMap 中的 Entry 可以简化为: static class Entry extends WeakReference<ThreadLocal<?>> { Object value; } 其中: Key,也就是 ThreadLocal,是弱引用; Value 是强引用。 如果外部不再引用某个 ThreadLocal,GC 可以回收 Key,此时 Map 中可能留下: ...