ThreadLocal : Java提供的一个工具类,作用是实现线程之间的数据隔离
它为每个线程都提供了一个独立的变量副本。
想象一个健身房(Java 应用程序):
每个人(线程)都有自己的专属柜子。
在 Web 开发(如 Spring Boot)中,每个 HTTP 请求都是由一个独立的线程处理的。
场景: 在拦截器里解析了 Token,拿到了用户的 ID(比如 empId)。在后续的 Service 层、Mapper 层,都需要用到这个 ID(比如记录“是谁新增了这条数据”)。
如果不使用 ThreadLocal,有两种笨办法:
empId 作为参数,从 Controller 一路传到 Service,再传到 Mapper。
controller.save(empId, dto)service.save(empId, dto)mapper.insert(empId, entity)public static Long currentId;
currentId 设为 1,李四的线程就把 currentId 改成了 2。等到张三真正用的时候,拿到的却是 2。这就是线程安全问题。使用 ThreadLocal 的解决办法: 使用 ThreadLocal 存储 empId。