在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、对象初始化性能开销等待等一些列问题。
第二单例模式枷锁,典型的案例是HashTable和Vector,对读取和变更的操作用synchronized限制起来,保证同一时间只有一个线程可以操作该对象。虽然解决了内存、回收、构造、初始化等问题,但是势必会因为锁竞争带来高并发下性能的下降。
第三个思路就是今天重点推出的ThreadLocal。单例模式下通过某种机制维护成员变量不同线程的版本。