在业务代码的第一行,将userInfo对象设置到CurrentUser,这样在业务代码中,就能通过CurrentUser.get()获取到刚刚设置的userInfo对象 。特别是对业务代码调用层级比较深的情况,这种用法非常有用,可以减少很多不必要传参 。
但在高并发的场景下,这段代码有问题,只往ThreadLocal存数据,数据用完之后并没有及时清理 。
ThreadLocal即使使用了WeakReference(弱引用)也可能会存在内存泄露问题,因为 entry对象中只把key(即threadLocal对象)设置成了弱引用,但是value值没有 。
那么,如何解决这个问题呢?
public void doSamething(UserDto userDto) {UserInfo userInfo = convert(userDto);try{CurrentUser.set(userInfo);...//业务代码UserInfo userInfo = CurrentUser.get();...} finally {CurrentUser.remove();}}
需要在finally代码块中,调用remove方法清理没用的数据 。
【聊聊并发编程的10个坑】
推荐阅读
- 聊聊 HTTP/2 的多路复用
- 糖尿病|肥胖可能引起糖尿病等50多种并发症!老人也能减肥缓解慢性病
- 聊聊Mybatis的binding模块
- 聊聊|炉石传说:是时候来聊聊这版本最脏职业到底是谁了
- 大学生|传奇世界:聊聊三职业终极技能,每一个都是经典!(上)
- 一个程序小BUG产生的原因
- 今日全民健身日,聊聊你不知道的健身锻炼冷知识
- 从三点进行分析说明,零基础看完也能明白 学习编程有什么用
- 创始人是王思聪,聊聊ig那些事 ig战队是王思聪的吗?
- 月经量少有哪些并发症?月经量少的患者应避免饮食