星海

并发 · 单选题 · 第 19 题

Java 后端开发面试 · 第 19 题

ThreadLocal 使用不当可能造成内存泄漏,原因是?

  1. AThreadLocalMap 的键和值都是强引用,所以 ThreadLocal 对象本身永远都无法被垃圾回收掉
  2. BThreadLocal 的数据存放在所有线程共享的堆区里,任何线程都能读到别的线程存的值
  3. CThreadLocalMap 的键是弱引用、值是强引用;线程长期存活又不调用 remove,值就回收不了
  4. D线程结束之后它的 ThreadLocalMap 也不会被释放,只能等 JVM 进程退出时才会回收

答案

C C. ThreadLocalMap 的键是弱引用、值是强引用;线程长期存活又不调用 remove,值就回收不了

解析

ThreadLocal 对象没有外部引用后,作为弱引用的键会被回收变成 null,但值仍被线程的 ThreadLocalMap 强引用着。线程池里的线程一直存活,这些值就一直无法回收,还可能被下一个任务读到脏数据。规范写法是在 finally 里调用 remove。线程结束时整个 Map 会随线程一起回收。

在线刷这套题:即时判分、错题本、闪卡复习,不用登录就能练。