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獲取場景。