- threadlocal
- Thread 类中有一个 ThreadLocal.ThreadLocalMap,这个 ThreadLocalMap 是一个特殊的哈希表,专门用于存储 ThreadLocal 变量的值。
- 每个线程都有自己的ThreadLocal.ThreadLocalMap,因此线程之间ThreadLocal数据是隔离的
- ThreadLocal跟随线程,因此在不同的处理阶段都可以对其进行增删改查,数据共享。
- 真正的项目开发中基本上都是从线程池里面获取线程的,所以线程执行完并不会死亡,而是会被线程池复用,所以一定要通过try catch finally 调用ThreadLocal的remove方法清空数据
- 应用场景
- 涉及aop的数据存取
- 典型的是用户登陆数据,在鉴权的时候会set数据,后续全流程共享该数据
- 涉及到全流程的数据
- 比如在多层架构中(如 Controller -> Service -> DAO),某些上下文信息(如用户 ID、请求 ID、事务状态等)需要在多个层级之间共享,但又不想通过每个方法调用的参数传递
- 涉及aop的数据存取
- 利弊
- 优点
- 解耦
- 线程隔离
- 缺点
- 过度依赖 ThreadLocal 可能会导致代码难以理解和维护,尤其是在大型项目中。通过参数传递数据可以避免滥用全局状态,使代码更具模块化和可测试性。
- 优点