七、ThreadLocal
配置ThreadLocal保存用户信息,使得可以在控制器方法中获取用户信息
在utils包下创建类
package com.ling.blog.utils;
import com.ling.blog.dao.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();
}
}
package com.ling.blog.controller;
import com.ling.blog.dao.pojo.SysUser;
import com.ling.blog.utils.UserThreadLocal;
import com.ling.blog.vo.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("test")
public class TestController {
@RequestMapping
public Result test(){
SysUser sysUser = UserThreadLocal.get();
System.out.println(sysUser);
return Result.success(null);
}
}
需要显式的将ThreadLocal存储的用户删除,否则可能会引起内存泄露
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserThreadLocal.remove();
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DVbK3NH8-1648631289716)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220324183954900.png)]
实线代表强引用,虚线代表弱引用
每一个Thread维护一个ThreadLocalMap, key为使用弱引用的ThreadLocal实例,value为线程变量的副本。
强引用,使用最普遍的引用,一个对象具有强引用,不会被垃圾回收器回收。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不回收这种对象。
如果想取消强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样可以使JVM在合适的时间就会回收该对象。
弱引用,JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。
如果不显式删除,弱引用的key会被JVM删除,那强引用的value不会不删除,就会引起内存泄露
|