ThreadLocal到底有没有内存泄漏?从源码角度来剖析一波
1. 前言 ThreadLocal 也是一个使用频率较高的类,在框架中也经常见到,比如 Spring。 有关 ThreadLocal 源码分析的文章不少,其中有个问题常被提及:ThreadLocal 是否存在内存泄漏? 不少文章对此讲述比较模糊,经常让人看完脑子还是一头雾水,我也有此困惑。因此找时间跟小伙伴讨论了一番,总算对这个问题有了一定的理解,这里记录和分享一下,希望对有同样困惑的朋友们有所帮助。当然,若有理解不当的地方也欢迎指正。 啰嗦就到这里,下面先从 ThreadLocal 的一个应用场景开始分析吧。 2. 应用场景 ThreadLocal 的应用场景不少,这里举个简单的栗子:单点登录拦截。 也就是在处理一个 HTTP 请求之前,判断用户是否登录: 若未登录,跳转到登录页面; 若已登录,获取并保存用户的登录信息。 先定义一个 UserInfoHolder 类保存用户的登录信息,其内部用 ThreadLocal 存储,示例如下: public class UserInfoHolder { private static final ThreadLocal<Map<String, String>> USER_INFO_THREAD_LOCAL = new ThreadLocal<>(); public static void set (Map<String, String>