ThreadLocal分析

Thread類有一個類型爲ThreadLocal.ThreadLocalMap的實例變量threadLocals,也就是說每一個線程有一個本身的ThreadLocalMap。ThreadLocalMap有本身的獨立實現,能夠簡單地將它的key視做ThreadLocal,value爲代碼中放入的值(實際上key並非ThreadLocal自己,而是它的一個弱引用)。每一個線程在往某個ThreadLocal裏塞值的時候,都會往本身的ThreadLocalMap裏存,讀也是以某個ThreadLocal做爲引用,在本身的map裏找對應的key,從而實現了線程隔離。數組

 

ThreadLocalMap節點繼承弱引用?優化

由於若是這裏使用普通的key-value形式來定義存儲結構,實質上就會形成節點的生命週期與線程強綁定,只要線程沒有銷燬,那麼節點在GC分析中一直處於可達狀態,沒辦法被回收,而程序自己也沒法判斷是否能夠清理節點。弱引用是Java中四檔引用的第三檔,比軟引用更加弱一些,若是一個對象沒有強引用鏈可達,那麼通常活不過下一次GC。當某個ThreadLocal已經沒有強引用可達,則隨着它被垃圾回收,在ThreadLocalMap裏對應的Entry的鍵值會失效,這爲ThreadLocalMap自己的垃圾清理提供了便利。線程

 

ThreadLocalMap中entry的大小必須爲2的冪?對象

因爲ThreadLocalMap使用線性探測法來解決散列衝突,因此實際上Entry[]數組在程序邏輯上是做爲一個環形存在的。繼承

ThreadLocalMap使用的是線性探測法,均勻分佈的好處在於很快就能探測到下一個臨近的可用slot,從而保證效率。這就回答了上文拋出的爲何大小要爲2的冪的問題。爲了優化效率。生命週期

相關文章
相關標籤/搜索