聊聊并发编程的10个坑( 六 )

在业务代码的第一行,将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个坑】


推荐阅读