记录一下 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 依然不会成立,当然这是小概率事件。

浙公网安备 33010602011771号