晓风的码研工坊Java Dev Mentorship
返回技术分享Java基础

从 ThreadLocal 到线程池:Java 并发避坑指南

ThreadLocal 内存泄漏、线程池参数配置、拒绝策略选择,梳理并发编程中最容易踩的几个坑。

2025-05-2513 分钟
从 ThreadLocal 到线程池:Java 并发避坑指南

并发编程是 Java 后端面试的必考模块,也是项目中最容易埋雷的地方。这篇文章聚焦两个高频考点:ThreadLocal 的内存泄漏问题,以及线程池参数配置不当导致的线上事故。

一、ThreadLocal 为什么会内存泄漏

ThreadLocalMap 中 Entry 的 key 是弱引用(指向 ThreadLocal 对象本身),但 value 是强引用。当 ThreadLocal 对象被回收后,key 变为 null,但 value 依然被 Entry 强引用而无法回收,这就是内存泄漏的根源——尤其在线程池场景下,线程长期存活,泄漏会持续累积。

// 正确用法:使用完毕后务必手动 remove
try {
    threadLocal.set(context);
    // 业务逻辑
} finally {
    threadLocal.remove();
}

二、线程池参数如何配置

  • corePoolSize:核心线程数,建议结合 CPU 密集型 / IO 密集型任务特点估算
  • maximumPoolSize:最大线程数,需要结合系统资源上限设置合理阈值
  • workQueue:任务队列,无界队列(如 LinkedBlockingQueue 不设容量)是线上 OOM 的常见诱因
  • RejectedExecutionHandler:拒绝策略,生产环境建议自定义策略并配合监控告警,而非直接抛异常

三、为什么不建议用 Executors 快捷方法

Executors.newFixedThreadPool 等快捷方法默认使用无界队列,容易在流量突增时导致内存溢出。阿里巴巴 Java 开发手册明确建议通过 ThreadPoolExecutor 构造函数显式指定队列容量与拒绝策略,这也是面试和代码规范审查中的高频考点。

真正的加分项不是背出这几个参数名,而是能结合具体业务场景说出"为什么这样配置"的推理过程。
#并发编程#ThreadLocal#线程池
CONTACT

扫码咨询,聊聊你的辅导需求

添加微信备注「毕设 / 作业 / 面试 + 学校或岗位」,通常 2 小时内回复。

微信咨询二维码
长按识别 / 扫码添加
微信号xiaofengtech-top
响应时间周一至周五20:00-23:30,周六至周日 9:00 - 23:00(响应通常在 2 小时内)
  • 沟通后 24 小时内给出可行性评估与辅导方案
  • 辅导过程中的代码与文档全部归你所有
  • 进度延期或方向不合适可随时调整,不套模板打包卖课