ThreadLocalMap中的key是弱引用,如果被GC了,那么线程再去get数据岂不是就没有了?

ThreadLocalMap中的key是弱引用,如果被GC了,那么线程再去get数据岂不是就没有了?

还是说ThreadLocalMap只能存一些缓存数据,被GC了就重新生成。

阅读 4.1k
2 个回答

引用的关系是
Thread -> ThreadLocalMap -> Entity -> 弱引用ThreadLocal数据
所以:

  1. 虽然是弱引用,但是只要其他地方还有普通引用,就不会被清理,会一直存在
  2. 如果不是弱引用,而且用户已经不再持有这个ThreadLocal的引用并且没有调用remove方法,那么只要线程还在,ThreadLocal数据就会一直被引用无法回收,就是内存泄漏了
  3. 所以这里用弱引用一定程度上是帮助忘记调用remove方法的用户做清理工作…
如果被GC了,那么线程再去get数据岂不是就没有了?

如果你还能去get数据,说明还有对ThreadLocal的强引用,那怎么会被GC呢...

不过如果你申明ThreadLocal变量就是用的弱引用,那当我没讲。(这个得算错误使用方法?)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题