个人博客项目:使用Threadlocal保存登录用户信息

该博客讨论了在后端系统中如何利用ThreadLocal来安全地存储和获取登录用户的个人信息,确保线程间的隔离,增强安全性。同时,提到了ThreadLocal存在的内存泄漏问题,解释了其原因,并指出即使ThreadLocal在内部进行了部分处理,仍需要在使用完毕后手动调用remove方法来避免内存泄漏。通过一个UserThreadLocal的示例,展示了如何设置、获取和移除用户信息。
摘要由CSDN通过智能技术生成

问题描述:

在用户成功登录后,我们在后端某些其它功能模块中需要获取到当前登录用户的信息。

并且需要保证用户信息的安全,除去当前线程外,其它线程无法获取到用户的信息。

解决方法 :

使用threadlocal保存用户信息,就可以在其它的功能模块中获取到已登录的用户信息。

实现了线程隔离,保证了用户信息安全。

threadlocal存在问题

threadlocal是存在内存泄漏的问题的,因为每一个Thread维护一个ThreadLocalMap,key为弱引用的Threadlocal实例,value为线程变量的副本,是强引用。在Threadlocal没有被外部强引用的情况下,当垃圾回收时,Threadlocal就会被清理掉,而此时key被清理掉了,而value不会被清理掉。

这样一来,ThreadLocalMap中就存在了key为NULL的键值对,永远无法被GC回收,这样长时间累积就会导致内存泄漏。其实Threadlocal已经考虑到了这样的问题,所以在调用setgetremove方法时,会清理掉key为NULL的记录。

但即使如此,在使用完用户信息后,还是要手动调用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();
    }
}

测试:

@RestController
@RequestMapping("test")
public class TestController {

    @RequestMapping
    public Result test(){
        SysUser sysUser = UserThreadLocal.get();
        System.out.println(sysUser);
        return Result.success(null);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值