码神之路博客系统技术精点(三)----ThreadLocal做线程隔离

ThreadLocal叫做线程变量,该变量为线程私有的。其作用是数据隔离

在博客系统中,我们使用ThreadLocal去保存用户的登录信息,在请求的线程之内,可以随时获取登录的用户.

简单介绍一下业务,我们将需要登录的业务做了一个拦截器拦截,在执行控制层方法前,先执行拦截器preHandle方法,在该方法内我们进行登录验证,并将验证好的用户放入UserThreadLocal中
就put、get、remove三个方法 但是特别需要注意remove方法(下文会讲)

public class UserThreadLocal {

    private UserThreadLocal(){}
    //线程变量隔离
    private static final ThreadLocal<SysUser> LOCAL = new ThreadLocal<>();

    public static void put(SysUser sysUser){
        LOCAL.set(sysUser);
    }

    public static SysUser get(){
        return LOCAL.get();
    }

    public static void remove(){
        LOCAL.remove();
    }
}

当我们需要用到登录的用户时,直接get出来

SysUser sysUser = UserThreadLocal.get();

是不是很方便呢?


重点来了,上文我们提到需要特别注意remove方法。这其实是与ThreadLocal生命周期有关。
我们上文说了,ThreadLocal中Key被设计成了弱引用。当线程结束了,会直接回收key,但是我们的value依然存在,这就造成了内存泄漏。为了规避此风险,我们需要在线程结束前,去remove()
在这里插入图片描述

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //如果不删除 ThreadLocal中用完的信息 会有内存泄漏的风险
        UserThreadLocal.remove();
    }

ThreadLocal 适用于如下两种场景

1、每个线程需要有自己单独的实例

2、实例需要在多个方法中共享,但不希望被多线程共享


2021年9月21日凌晨45分,我跟她已经分手一天了。脑子很乱,上午在该死的床上躺了一上午,分手是我提的,我没有奔溃,也没有高兴,只有难过,说不出来那种。
下午学习的时候在胡思乱想,突然想看她之前给我推荐的恋爱综艺,可能这就是走你走过的路,看你看过的电影。
此刻,我很想你。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值