ThreadLocal保存用户信息

UserThreadLocal类编写

  用于存放数据、获取数据、删除数据

import com.he.blogapi.pojo.SysUser;

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();
    }
}

 

拦截器放行并且登录成功之后存放数据

UserThreadLocal.put(sysUser);

 

获取数据

SysUser sysUser = UserThreadLocal.get();

 

程序运行玩删除数据,避免内存泄漏

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

 

为什么用完数据需要删除ThreadLocal中的信息原理:

 

 

实线代表强引用,虚线代表弱引用

  每一个Thread维护一个ThreadLocalMap, key为使用弱引用的ThreadLocal实例,value为线程变量的副本。

  强引用,使用最普遍的引用,一个对象具有强引用,不会被垃圾回收器回收。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不回收这种对象。

  如果想取消强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样可以使JVM在合适的时间就会回收该对象。

  弱引用,JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。

posted @ 2022-09-12 14:27  Homnay  阅读(91)  评论(0)    收藏  举报