使用规范

在拦截器中进行设置和清理操作

image-20260509165248365

封装成工具类进行调用

为什么工具类,不直接注入容器?ThreadLocal:它的设计目的是为每一个线程提供一个独立的变量副本。每个线程访问 get()时,拿到的是自己线程里的那个值,和其他线程互不干扰;容器是单例,所有的线程拿到的都是同一个了

为什么要是私有静态的?

每个线程内部有一个 ThreadLocalMap,它以 ThreadLocal 实例本身作为 Key 来存取对应的 Value;

image-20260510151625042

ThreadLocal在ThreadLocalMap的Entry中是一个弱应用的key,为什么外部还要用一个强引用呢,不是自相矛盾了吗?

  1. 设计成弱引用的必要性;看下面的情况,如果没有设计成弱引用,用户又错误使用,那么ThreadLocalMap的一直是强引用,会一直持有,永远无法回收

    image-20260510153213497

  2. 外部强引用,如果不规范使用,忘记remove,确实还是会造成无法回收,外部引用让用户可以自主的去控制,

  3. value肯定不能设计成弱引用,不然正常情况下去获取,value被回收可能就直接回去为NULL了

跨线程传递ThreadLocal

首先,如果你只是想简单的传一些参数的话可以考虑:

image-20260510164914803

如果是业务很复杂,线程套线程的,可以考虑ThreadLocal

方法一

不用线程池,不复用线程的场景,JDK自带的类:InheritableThreadLocal

方法二

使用线程池的情况下,开源工具TTL:TransmittableThreadLocal