在使用 threadlocal 的時候,一般我們的**都是這樣寫的:
public
class
threadlocaldemo
public
static long getuserid()
public
static
void
remove()
}
然後處理業務的是乙個執行緒池,有乙個結果就是 「threadlocal 引用」 context(靜態變數) 和 「thread 引用」(執行緒池裡的執行緒)會常駐記憶體。引用關係如圖所示:
雖然 key 使用了弱引用,但是 key 指向的 「threadlocal 物件」還一直被「threadlocal 引用」給引用著,這樣 threadlocal 裡的 expungestaleentry 方法是無法進行清理的(清理 key 為 null 的元素)。
threadlocal 的使用場景不應該圖省事,就用來傳遞業務引數,這樣增加了程式複雜度,**可讀性降低,處理不當還會記憶體洩漏,適用於一些日誌、監控類的場景。
try
finally
weakreference:
軟引用、弱引用、虛引用-他們的特點及應用場景
更多參考:
對threadlocal實現原理的一點思考
關於ThreadLocal記憶體洩漏的問題
引用 對於threadlocal,我的理解是 每個執行緒thread物件裡面有個threadlocalmap 可以當成map看 map物件裡面的key就是threadlocal物件,value是threadlocal set進去的object物件。如果在邏輯執行完成後,key value鍵值對沒有從...
ThreadLocal記憶體洩漏
重新上傳 取消threadlocal threadlocal的實現是這樣的 每個thread維護乙個threadlocalmap對映表,這個對映表的key是threadlocal例項本身,value是真正需要儲存的object。也就是說threadlocal本身並不儲存值,它只是作為乙個key來讓執...
ThreadLocal 記憶體洩漏
個人對記憶體洩漏的理解 如果乙個我用不到物件一直在記憶體裡,那麼就出現記憶體洩漏了。簡單說一下theadlocal實現原理 通過執行緒私有的空間來儲存資料,即在thread類裡有乙個threadlocalmap型別的變數 threadlocal values pertaining to this t...