ThreadLocal
使用规范
在拦截器中进行设置和清理操作

封装成工具类进行调用
为什么工具类,不直接注入容器?ThreadLocal:它的设计目的是为每一个线程提供一个独立的变量副本。每个线程访问
get()时,拿到的是自己线程里的那个值,和其他线程互不干扰;容器是单例,所有的线程拿到的都是同一个了
为什么要是私有静态的?
每个线程内部有一个
ThreadLocalMap,它以ThreadLocal实例本身作为 Key 来存取对应的 Value;

ThreadLocal在ThreadLocalMap的Entry中是一个弱应用的key,为什么外部还要用一个强引用呢,不是自相矛盾了吗?
设计成弱引用的必要性;看下面的情况,如果没有设计成弱引用,用户又错误使用,那么ThreadLocalMap的一直是强引用,会一直持有,永远无法回收
外部强引用,如果不规范使用,忘记remove,确实还是会造成无法回收,外部引用让用户可以自主的去控制,
value肯定不能设计成弱引用,不然正常情况下去获取,value被回收可能就直接回去为NULL了
跨线程传递ThreadLocal
首先,如果你只是想简单的传一些参数的话可以考虑:

如果是业务很复杂,线程套线程的,可以考虑ThreadLocal
方法一
不用线程池,不复用线程的场景,JDK自带的类:InheritableThreadLocal
方法二
使用线程池的情况下,开源工具TTL:TransmittableThreadLocal
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 夏天的风吹向哪里!

