ThreadLocal该何时注入值?

一.我们用ThreadLocal来干嘛?

        ThreadLocal 是一个 Java 中的类,用于在多线程环境下维护线程局部变量。每个线程都有自己独立的变量副本,互不干扰。通常情况下,我们使用 ThreadLocal 来存储与线程相关的数据,使得这些数据对于每个线程都是独立的。

二.为什么要用ThreadLocal?

        有些数据只需要在当前线程内部使用,不需要在多个线程之间共享,使用 ThreadLocal 可以很好地实现这种线程封闭性;也就是多线程下的数据隔离!

        在多线程环境下,如果某些数据需要在不同线程之间传递,可能需要通过参数传递或者共享变量,而使用 ThreadLocal 则可以避免这种复杂性,每个线程都可以通过 ThreadLocal 直接获取自己的数据.

三.何时需要注入值?

        通常情况下,你会在一个线程中设置 ThreadLocal 的值,然后在同一个线程中的其他地方获取这个值。这样可以确保数据只在当前线程内部有效,不会被其他线程访问到。注入值的时机取决于你的具体需求,通常在线程开始时或者某个特定操作中注入值。

        在我之前的项目中就犯过一个错误,在登录成功存入redis,再存入ThreadLocal中,我当时认为,在这里注入后,其他地方也就可以使用了,幸好当时组长review的时候发现了这个问题,并一步一步指引我去理解,在登录成功后注入ThreadLocal,那一个请求是一个线程吗?线程销毁ThreadLocal中的值还会存在吗,你这样注入值有意义吗?之后深看ThreadLocal,首先当时做的项目是springcloud项目,使用的是dubbo协议,他是不会携带前端传过来的Header的,所以去到其他服务是没办法从ThreadLocal中获取到的(可以做拦截器添加请求头,OpenFeign同理),其次是注入的时机,采用的方式也是通过request中的token(ticket)去redis中取值,具体如何写有很多方式,自己觉得哪个好用就用哪个(过滤器拦截器...)

四.必须要销毁吗?

        一般情况下,不需要手动销毁 ThreadLocal。Java 中的 ThreadLocal 在每个线程执行结束后会被自动清理,避免内存泄漏。但是,在某些特殊情况下,如果你在使用完 ThreadLocal 后不再需要其持有的值,可以通过调用 remove 方法手动清除对应线程的值,以帮助 JVM 更早地回收相关的资源,但这不是必须的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值