ThreadLocal实现隐式传参

项目中通过的ThreadLocal实现隐式传参十分常用,要了解ThreadLocal实现隐式传参,首先,我们需要简单的了解一下什么是ThreadLocal,这里简单介绍一下。

ThreadLocal 是 Java 中一个非常重要的类,它提供了线程局部变量的机制。线程局部变量是指每个线程都有自己独立的变量副本,彼此之间不会相互干扰。ThreadLocal 的特点包括:

  1. 线程隔离性(Thread Isolation):每个线程都有自己的变量副本,互不影响。线程之间的数据相互独立,不会发生竞态条件。

  2. 数据隔离性(Data Isolation)ThreadLocal 提供了线程私有的变量,可以在多线程环境下共享对象,但不共享其状态。

  3. 线程安全性(Thread Safety):每个线程都操作自己的变量副本,因此不需要额外的同步措施来保证线程安全。这减少了锁的竞争,提高了并发性能。

  4. 简化多线程编程:使用 ThreadLocal 可以避免传递参数的复杂性,使得代码更加简洁。在一些场景下,特别是需要在多个方法中共享变量,但又不希望使用方法参数传递的情况下,ThreadLocal 提供了一种简单的解决方案。

  5. 内存泄漏风险:使用不当可能导致内存泄漏,因为 ThreadLocal 中的变量是线程私有的,如果没有及时清理,可能会导致内存泄漏问题。在使用完毕后应该调用 remove() 方法来清理 ThreadLocal

  6. 适用范围ThreadLocal 适合在多线程环境下保存线程私有的状态信息,如数据库连接、会话信息等。

而在我接触的项目中,在获取当前登录用户信息的场景,就非常适合ThreadLocal的使用。应为它试用于多线程场景,且也能保护用户信息的安全。具体获取用户信息的思路如下:

流程:

1. 当用户登录系统后回想客户端保存一份token(相当于一张登录的入场券)

2. 用户每次在使用前端系统访问后端服务是,都会将token已请求头的方式发送给后端。一般请求头的key位Authorization

3. 用户的请求到网关后,网关全局过滤器会对令牌进行解析等操作

4. 这时候业务服务,接受网关路由过来的请求后,需要进行解析:

        a. 使用拦截器拦截请求头,从中获得用户登录信息

        b. 拦截器会将用户的数据存储到线程局部变量ThreadLocal中(这里我把该对象封装到一个工具类UserContext中),实现隐式传参。

5. 业务服务可以通过工具类UserContext中获得用户信息,可以从线程局部变量中获得需要的用户信息(例如,用户ID)

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值