Hubz131 2022-03-16 22:48 采纳率: 50%
浏览 16
已结题

ThreadLocal遇到线程池时导致的内存泄漏问题

问题:线程池中的A线程运行A1任务时设置了threadlocal1变量的值,A1任务结束后,对threadlocal1的引用不会消失。那么再次运行任务A2时再次设置threadlocal1的值,不会覆盖掉原来的值吗?还会继续生成新的Threadlocal对象作为新的可以吗?

期望:
有没有样例以供调试查看。

  • 写回答

3条回答 默认 最新

  • 一恍过去 Java领域优质创作者 2022-03-18 09:59
    关注

    在使用完ThreadLocal后,最好是将其变量进行删除,因为ThreadLocal是整个线程的生命周期有效,形成了线程与线程之间的隔离,所以无法覆盖。
    参考代码如下,通过getUser获取值,setUser设置值,remove删除值,多线程时为了保证内存不溢出,需要在线程结束时进行删除,否则将一直占用内容:

    public class RequestHolder {
    
        private static final ThreadLocal<SysUser> userHolder = new ThreadLocal<SysUser>();
    
    
        public static void setUser(SysUser sysUser) {
            userHolder.set(sysUser);
        }
    
        public static SysUser getUser() {
            return userHolder.get();
        }
    
        public static void remove() {
            userHolder.remove();
        }
    }
    

    参考博客:https://blog.csdn.net/zhuocailing3390/article/details/123030701

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 修改了问题 3月17日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥50 我撰写的python爬虫爬不了 要爬的网址有反爬机制
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等