高併發研究室07 ThreadLocal講解

2021-10-08 04:09:07 字數 1314 閱讀 9982

本章主要講一下本地執行緒變數threadlocal

每乙個thread執行緒中有乙個threadlocalmap

threadlocalmap 自身類似於是乙個 map,裡面會有乙個個 key value 形式的鍵值對.key指的就是threadlocal的引用。value就是儲存的內容。

public void set(t value)
set 方法的作用是把我們想要儲存的 value 給儲存進去。首先是獲取當前執行緒的引用,根據getmap方法和當前執行緒引用來獲取threadlocalmap,以當前threadloacl為key將值儲存。

public t get

() } //如果執行緒內之前沒建立過 threadlocalmap,就建立 return setinitialvalue(); }

get方法,先獲取到當前執行緒的引用,通過getmap()方法和當前執行緒的引用來獲取threadlocalmap。threadlocalmap其實類似於hashmap,可以根據getentry的方式(引數是threadlocal,也就是this)來獲取entry物件,通過entry.value來獲取儲存值

根據上述的講解,如果需要多個執行緒變數,需要定義多個threadlocal來使用。

threadlocal會導致記憶體洩漏

我們重點看一下下面這條鏈路:thread ref → current thread → threadlocalmap → entry → value → 可能洩漏的value例項。

static class entry extends weakreference>  }
threadlocalmap內部實際是個entry陣列,如上述**所述,當前threadlocal的引用k被傳遞給weakreference的建構函式,所以threadlocalmap中的key為threadlocal的弱引用。當乙個執行緒呼叫threadlocal的set方法設定變數的時候,當前執行緒的threadlocalmap就會存放乙個記錄,這個記錄的key值為threadlocal的弱引用,value就是通過set設定的值。

如果在沒有其他地方引用這個threadlocal的話,gc會對弱引用的key進行**,但是value不是弱引用。這是就會出現key為null,value不為null的entry項。造成記憶體洩漏

remove原始碼

public void remove

()

remove其實就是將 key 所對應的 value 給清理掉。這樣gc就能**它了。

本文使用 mdnice 排版

一些研究人體運動的國外研究室的鏈結

乙個專門研究人機互動的實驗室,看起來成果不錯 老外搞研究還要光膀子,好猛 使用temporal motion models 時態運動模型跟蹤結果 介紹了如何限制人體關節 estimating human body pose without tracking body 通過神經網路建立訓練集 http...

哈爾濱工業大學軟體工程研究室的主要研究方向

一 網路資訊檢索 1 文字檢索 研究linux環境下的大規模文字索引和檢索技術。包括實時索引 索引合併 索引更新 檢索模型 排序演算法 反饋學習。2 網頁搜尋 研究linux機群環境下的海量網頁的爬行 儲存 分析 索引 檢索技術。包括 面向主題的網頁爬行器 分布式網頁爬行器 分布式檔案系統 分布式資...

sql高併發量處理研究

關於資料庫的高併發處理研究,蟲子只是淺嘗輒止。可能很多方面各位大牛都用過,蟲子就來丟醜一下了。基於web方面的減壓蟲子已經在博文中介紹過 就不贅述了 本章我們著重介紹下基於資料庫的解決方案 1.分庫分表 按業務來算,橫向分庫 縱向分表。2.資料庫集群和庫表雜湊 大型 都有複雜的應用,這些應用必須使用...