記錄一下 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

相關文章
相關標籤/搜索