Java面试题更新 2026-08-03

请说明 Spring 框架是如何处理线程并发问题的,并具体谈谈你对 ThreadLocal 的理解,包括其工作原理、使用场景以及潜在的内存泄漏风险。

考察说明

考查候选人对 Spring 并发处理机制和 ThreadLocal 内部原理的掌握程度,以及在实际开发中正确使用和规避风险的能力。

回答思路

  1. 【回答框架 1】Spring 处理线程并发主要是通过提供线程安全的 Bean 和事务管理机制,常见的做法包括使用线程安全的集合、同步块、锁以及原子类,并且注意 Bean 的作用域,默认单例 Bean 应该避免持有可变状态,可以利用 ThreadLocal 来隔离线程状态,但需注意使用后清理。
  2. 【回答框架 2】ThreadLocal 的原理是每个线程内部维护一个 ThreadLocalMap,以 ThreadLocal 实例为 key,以设置的值为 value,因此每个线程对同一个 ThreadLocal 的读写互不影响,实现了线程之间的数据隔离。在 Spring 中,ThreadLocal 常用于存储事务上下文、请求上下文等信息。
  3. 【回答框架 3】使用 ThreadLocal 的典型场景包括:Spring 的 RequestContextHolder 保存当前请求的上下文,MyBatis 或 Hibernate 的 SessionHolder 保存数据库会话,以及实现像 SimpleDateFormat 这样的非线程安全类的线程安全使用。但要注意,线程池环境下使用 ThreadLocal 必须在使用完毕后调用 remove 方法,否则可能造成内存泄漏,因为线程池核内的线程是复用的,其 ThreadLocalMap 不会自动清理。
  4. 【回答框架 4】为了避免 ThreadLocal 的内存泄漏,建议使用完及时调用 remove,或者在 ThreadLocal 中使用弱引用,但弱引用只能解决 key 的回收,value 的回收仍需依赖显式清理。此外,Spring 的 TransactionSynchronizationManager 就是 ThreadLocal 的典型应用,它保存事务同步信息,并在事务完成后自动清理。
  5. 【关键点 1】Spring 通过线程安全类和锁等机制处理并发,单例 Bean 应无状态化。
  6. 【关键点 2】ThreadLocal 实现线程间数据隔离,原理是线程内部的 ThreadLocalMap。
  7. 【关键点 3】ThreadLocal 使用后必须 remove,否则在线程池场景下可能内存泄漏。
  8. 【关键点 4】ThreadLocal 在 Spring 中用于保存事务上下文、请求上下文等。
  9. 【易错点 1】错误认为 ThreadLocal 可以解决所有并发问题,它只隔离变量,不能保证操作的原子性。
  10. 【易错点 2】忽略线程池下 ThreadLocal 的清理,导致内存泄漏或数据串扰。
  11. 【易错点 3】继承问题:InheritableThreadLocal 可传给子线程,但线程池中的线程不会自动继承,需要额外处理。