本文主要回答如下幾個(gè)問題,如果你已經(jīng)知道了采缚,太棒啦内边!那你可以關(guān)閉本文去看其他文章啦。
① Thread女阀、ThreadLocal、ThreadLocalMap屑迂、value的內(nèi)存布局浸策。
② ThreadLocalMap的Entry為什么要繼承自WeakReference?
③ 眾所周知的內(nèi)存泄露問題是怎么回事惹盼?如何解決庸汗?
④ 為什么我們建議ThreadLocal要用static的?
⑤ ThreadLocalMap怎么解決Hash沖突的手报?
一蚯舱、內(nèi)存布局
如下圖所示:每個(gè) Thread里面都有一個(gè)ThreadLocalMap,ThreadLocalMap中真正存儲(chǔ)數(shù)據(jù)的是一個(gè)Entry數(shù)組掩蛤,Entry的Key是ThreadLocal對象的弱引用枉昏。
二、為什么繼承自WeakReference?
補(bǔ)充一個(gè)知識(shí)點(diǎn)揍鸟,Java中引用有四種:強(qiáng)軟弱虛兄裂。強(qiáng)度依次減弱。只被弱引用關(guān)聯(lián)的對象只能生存到下一次垃圾收集發(fā)生之前蜈亩。 當(dāng)垃圾收集器工作時(shí)懦窘,無論當(dāng)前內(nèi)存是否充足,都會(huì)回收掉只被弱引用關(guān)聯(lián)的對象稚配,因此弱引用一般用來指向非必須對象畅涂。
好的,接下來我們解釋為什么ThreadLocalMap的Entry要繼承自WeakReference道川。