ThreadLocal 的典型用法:
一、 线程隔离的数据共享(最核心的应用场景)
这是 ThreadLocal 最核心的应用场景,也是它设计的初衷。 在多线程环境下,当我们需要在同一个线程内部共享数据,但又希望这些数据在不同线程之间相互隔离,互不干扰时,ThreadLocal 就派上了用场。
1. Web 应用中的请求上下文
-
场景描述:
- 在 Web 应用中,每个 HTTP 请求通常由一个独立的线程来处理。
- 在处理请求的过程中,可能需要用到一些与当前请求相关的信息,例如:
- 用户信息: 当前登录用户的 ID、用户名、权限等。
- 请求信息: 请求 ID、请求时间戳、客户端 IP 地址等。
- 事务上下文: 数据库事务的相关信息,例如事务 ID、连接对象等。
- 语言环境: 用户的语言偏好设置。
- 这些信息需要在处理请求的各个环节(例如 Controller、Service、DAO)中共享,但不同请求之间需要隔离。
-
ThreadLocal的作用:- 将这些与请求相关的信息存储在
ThreadLocal变量中。 - 由于每个请求由一个独立的线程处理,
ThreadLocal保证了这些信息在同一个请求的处理过程中是共享的,但在不同请求之间是隔离的。 - 避免了在每个方法中都显式传递这些参数,简化了代码。
- 将这些与请求相关的信息存储在
-
代码示例(简化):
// 模拟存储用户信息的 ThreadLocal public class UserContext { private static final ThreadLocal<User> userHolder = new ThreadLocal<>(); public static void setUser(User user) { userHolder.set(user); } public static User getUser() { return userHolder.get(); } public static void clear() { userHolder.remove(); } } // 模拟 Controller public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } public void handleRequest(User user) { // 将用户信息存储到 ThreadLocal 中 UserContext.setUser(user); // 调用 Service 层处理业务逻辑 userService.processUser();

最低0.47元/天 解锁文章
1306

被折叠的 条评论
为什么被折叠?



