利用单个ThreadLocal对象,实现单线程的数据共享

本文介绍了在Spring MVC中如何利用ThreadLocal实现单线程间的数据共享,以解决已登录用户的user数据传递问题。通过拦截器获取cookie-token,从redis获取user数据并存入ThreadLocal中,最后在afterCompletion方法中释放ThreadLocal以防止内存泄漏。同时,文章解释了ThreadLocal的工作原理和在Spring中的应用。
摘要由CSDN通过智能技术生成

在Spring MVC 单条请求 之间共享数据
业务:已登录用户,访问controller,我们需要获得它的user数据;

解决思路

1.request 域

2.session域

--->需要在Controler 方法的参数上传入request,代码过于侵入式;

3.THreadLocal--->好

实现:1.拦截器中,获取cookie-token

    2.根据token,获取到redis中的user数据

    3.存在就放行,并将user数据写入threadLocal中;

   4.在拦截器的afterCompletion()方法里写上释放ThreadLocal对象的方法:因为GC无法回收ThreadLocal,会造成内存泄漏,从而长期以往造成内存溢出;



为了解决线程安全的问题,我们有3个思路:

第一每个线程独享自己的操作对象,也就是多例,多例势必会带来堆内存占用、频繁GC、对象初始化性能开销等待等一些列问题。

第二单例模式枷锁,典型的案例是HashTableVector,对读取和变更的操作用synchronized限制起来,保证同一时间只有一个线程可以操作该对象。虽然解决了内存、回收、构造、初始化等问题,但是势必会因为锁竞争带来高并发下性能的下降。

第三个思路就是今天重点推出的ThreadLocal。单例模式下通过某种机制维护成员变量不同线程的版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值