ThreadLocal应用场景

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();
    
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值