记录一下 ThreadLocal 与 WeakReference

ThreadLocal & WeakReference

Thread整体的模块图

  • Thread -> ThreadLocalMap 对于继承了 WeakReference Entry本身引用是强引用,Entry本身是作为 key存在的,这一点与上图不同,网上类似的文章有大量的雷同的截图.. 其实是误导,理解的话还是要看代码

  • 其实真正的弱引用发生在 Entry -> object (ThreadLocal) 如下图

ThreadLocalMap 清理的机制

看上图知就知道当 k == null 的时候就会执行清理计划,但是这并没有什么卵用,
虽然ThreadLocalMap对于 ThreadLocal的引用是弱引用,但是大部分场景,
如下图所示 ThreadLocal本身都是被static 静态变量引用的,
, 也就是说 上图中(k == null)90%的情况下并不会发生。

除非你的ThreadLocal只是被单个线程栈引用,当这个线程中的栈幁对ThreadLocal的引用不存在了,
上图中的 k == null 才会成立,而且成立的条件也要看虚拟机的回收机制,
如果运行中没有触发GC k == null 依然不会成立,当然这是小概率事件。

posted @ 2021-01-17 21:49  Richard_Winters  阅读(145)  评论(0)    收藏  举报