ThreadLocal總結(jié)

1.什么是ThreadLocal

它是一個(gè)本地線程副本變量的工具,用于私有線程和該線程存放的副本對象做一個(gè)映射,實(shí)現(xiàn)多個(gè)線程之間的變量互不干擾。

2.ThreadLocal 工作原理是什么?

每一個(gè)線程都會(huì)有一個(gè)ThreadLocalMap,他是(key,value)格式,他的key是一個(gè)弱引用,也就是ThreadLocal本身,而他的value就是存儲(chǔ)的副本變量,也就是說,ThreadLocal并不參與存儲(chǔ)變量,而是作為一個(gè)工具,用來維護(hù)線程中的Map,幫助它存取變量。

3.ThreadLocal 如何解決 Hash 沖突

ThreadLocal和HashMap不一樣,并不是利用鏈?zhǔn)浇Y(jié)構(gòu)去解決hash沖突,而是采用線性探測的方式。所謂線性探測,就是根據(jù)初始 key 的 hashcode 值確定元素在 table 數(shù)組中的位置,如果發(fā)現(xiàn)這個(gè)位置上已經(jīng)被其他的 key 值占用,則利用固定的算法尋找一定步長的下個(gè)位置,依次判斷,直至找到能夠存放的位置。

4.ThreadLocal 的內(nèi)存泄露是怎么回事?

因?yàn)門hreadLocalMap 的key是弱引用,當(dāng)JVM進(jìn)行垃圾回收時(shí)會(huì)把key回收掉,而map的value是強(qiáng)引用,JVM無法回收它,就會(huì)一直儲(chǔ)存在內(nèi)存中,因而導(dǎo)致內(nèi)存泄漏。

5.為什么 ThreadLocalMap 的 key 是弱引用

如果是強(qiáng)引用,ThreadLocal對象被回收時(shí),由于ThreadLocalMap還保持強(qiáng)引用,如果不進(jìn)行手動(dòng)回收,還是會(huì)導(dǎo)致內(nèi)存泄漏,而是弱引用的話,在調(diào)用set,get,remove的時(shí)候會(huì)被清除。

6.ThreadLocal 的應(yīng)用場景有哪些

適用于獨(dú)立變量副本的情況,比如Hibernate的session獲取場景。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容