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

相关文章
相关标签/搜索