返回技术分享Java基础
从 ThreadLocal 到线程池:Java 并发避坑指南
ThreadLocal 内存泄漏、线程池参数配置、拒绝策略选择,梳理并发编程中最容易踩的几个坑。
2025-05-2513 分钟

并发编程是 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#线程池

