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