expungeStaleEntry(int staleSlot):
(1)清理當前位置 staleSlot 的臟 Entry 節(jié)點爷耀,將該臟 Entry.value 置 null不撑,接著將 hash 表的當前位置置 null,這樣下次 gc
如果 value 沒其它引用了就會被回收掉,臟 Entry 節(jié)點對象也會被回收掉宣渗,hash 表元素數(shù)量減一嘶是;
(2)從當前位置的下一個環(huán)形位置開始循環(huán)對 Entry 節(jié)點進行清理或 rehash,直到碰到某個位置沒有 Entry 節(jié)點為止晴埂。在這個過程中究反,
對于每個位置的 Entry 節(jié)點,如果它是臟 Entry儒洛,就對它進行清理精耐,清理邏輯和(1)一樣,否則是正常 Entry 節(jié)點琅锻,就會判斷它是否
要 rehash卦停,判斷依據(jù)是根據(jù)它的 threadLocalHashCode 確定它的存儲位置,如果是當前位置恼蓬,什么都不做惊完,如果不是當前位置,說明
之前在加入這個節(jié)點時存在 hash 沖突处硬,通過線性探測存儲到了當前位置小槐,那么就會對該節(jié)點進行 rehash,先將當前 hash 表位置置 null郁油,
然后先判斷它直接計算出來的存儲位置本股,如果為 null 說明存在 hash 沖突的節(jié)點被清理了,則將 Entry 節(jié)點存儲到該位置桐腌,否則會進行
線性探測拄显,向后環(huán)形搜索找到第一個節(jié)點為 null 的位置,并將 Entry 節(jié)點存儲到該位置案站,這樣就會把清理臟 Entry 后空出來的位置給
填充上躬审,這樣做的目的是為了避免 ThreadLocal.get()、set()、remove() 這些方法時出現(xiàn)錯誤承边,這三個方法在執(zhí)行時都會查找當前 ThreadLocal
對象對應的 Entry 節(jié)點是否存在遭殉,判斷是否存在的依據(jù)就是根據(jù)當前 ThreadLocal 對象的 threadLocalHashCode 直接計算出來的存儲位
置或者向后環(huán)形查找的位置是否存在弱引用指向當前 ThreadLocal 對象的 Entry 節(jié)點,這個過程會在碰到第一個 null 節(jié)點時結束博助,此時
就認為不存在當前 ThreadLocal 對象對應的 Entry 節(jié)點了险污,如果不判斷是否要 rehash 而只是清理臟 Entry 的話,可能由于處于臟 Entry
節(jié)點位置環(huán)形順序后面的位置存在和臟 Entry 節(jié)點有 hash 沖突的并且弱引用指向當前 ThreadLocal 對象的節(jié)點富岳,這樣就會導致向后環(huán)形
查找時提前退出而無法找到當前 ThreadLocal 獨象對應的 Entry 節(jié)點蛔糯,對于 get() 方法就是無法讀取到當前 ThreadLocal 對象的值,
對于 remove() 方法就是無法刪除當前 ThreadLocal 對象的值窖式,對于 set() 方法就會在 null 節(jié)點位置創(chuàng)建并存儲一個新的 Entry 節(jié)點蚁飒,
導致 ThreadLocalMap hash 表中存在了兩個弱引用指向當前 ThreadLocal 對象的節(jié)點。
(3)最后返回導致循環(huán)退出的 null 節(jié)點的位置萝喘。
簡單總結:
清理 "[當前臟 Entry 位置, 下一個為 null 的環(huán)形位置]" 之間的所有臟 Entry淮逻,并對正常 Entry 依據(jù)情況做 rehash,返回下一個為
null 的環(huán)形位置阁簸。
ThreadLocalMap
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門优幸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人褪猛,你說我怎么就攤上這事网杆。” “怎么了伊滋?”我有些...
- 文/不壞的土叔 我叫張陵碳却,是天一觀的道長。 經(jīng)常有香客問我笑旺,道長昼浦,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任筒主,我火速辦了婚禮关噪,結果婚禮上鸟蟹,老公的妹妹穿的比我還像新娘。我一直安慰自己使兔,他們只是感情好建钥,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虐沥,像睡著了一般熊经。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欲险,一...
- 文/蒼蘭香墨 我猛地睜開眼脚翘,長吁一口氣:“原來是場噩夢啊……” “哼灼卢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起来农,我...
- 正文 年R本政府宣布,位于F島的核電站遭赂,受9級特大地震影響循诉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嵌牺,卻給世界環(huán)境...
- 文/蒙蒙 一打洼、第九天 我趴在偏房一處隱蔽的房頂上張望龄糊。 院中可真熱鬧,春花似錦募疮、人聲如沸炫惩。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽他嚷。三九已至,卻和暖如春芭毙,著一層夾襖步出監(jiān)牢的瞬間筋蓖,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- ThreadLocal源碼學習 ThreadLocal的工作過程更像是一個工具人例证,其核心代碼set路呜、get等都是通...
- 原創(chuàng)文章&經(jīng)驗總結&從校招到A廠一路陽光一路滄桑 詳情請戳www.codercc.com 1. 造成內(nèi)存泄漏的原因...
- ThreadLocalMap原理 ThreadLocalMap定義在ThreadLocal類內(nèi)胀葱,被Thread類使...
- 1. 造成內(nèi)存泄漏的原因巡社? threadLocal是為了解決對象不能被多線程共享訪問的問題,通過threadLoc...