ThreadLocal源码探析( 五 )

通常ThreadLocalMap的生命周期跟Thread(注意线程池中的Thread)一样长 , 如果没有手动删除对应key(线程使用结束归还给线程池了 , 其中的KV不再被使用但又不会GC回收 , 可认为是内存泄漏) , 一定会导致内存泄漏 , 但是使用弱引用可以多一层保障:弱引用ThreadLocal会被GC回收 , 不会内存泄漏 , 对应的value在下一次ThreadLocalMap调用set,get,remove的时候会被清除 , Java8已经做了上面的代码优化 。
 
总结

  • 每个ThreadLocal只能保存一个变量副本 , 如果想要一个线程能够保存多个副本以上 , 就需要创建多个ThreadLocal 。
  • ThreadLocal内部的ThreadLocalMap键为弱引用 , 会有内存泄漏的风险 。
  • 每次使用完ThreadLocal , 都调用它的remove()方法 , 清除数据 。




推荐阅读