在類中定義了一個threadlocal變量來維護一些實例。設置和獲取遞歸方法。當請求完成時(我已經用其他方式分析過,我無法清除threadlocal),我無法清除threadlocal變量。如果不清除ThreadLocal變量,會發生什麼情況?
我的問題是,如果我沒有清除每個請求的threadlocal變量,會發生什麼?有什麼影響?
在類中定義了一個threadlocal變量來維護一些實例。設置和獲取遞歸方法。當請求完成時(我已經用其他方式分析過,我無法清除threadlocal),我無法清除threadlocal變量。如果不清除ThreadLocal變量,會發生什麼情況?
我的問題是,如果我沒有清除每個請求的threadlocal變量,會發生什麼?有什麼影響?
如果線程死亡,對ThreadLocal入口的引用也會死亡,因此您的對象(假設沒有其他引用)將被垃圾收集。
只要線程存在,您的對象也一樣。
您必須評估對於長期存在的對象的影響。
您有內存泄漏,並且可能已經設置了ThreadLocal,下次調用代碼時。 ThreadLocals有點代碼味道imo。
的Javadoc說:一個線程消失
後,所有線程本地實例 其副本都會被垃圾回收(除非存在對這些副本 其它參考資料)。
例如,the implementation這裏被使用weak references爲重點哈希表支持。在這種情況下,關鍵是線程。如果線程終止,映射中的條目就有資格進行垃圾回收。
只有當系統開始用盡內存空間時,垃圾收集纔可能發生。但是這種考慮適用於系統中的所有對象:何時開始回收對象取決於GC策略,該策略是VM指定的並且可以進行調整。
這是我的線程局部變量的好的和不好的用法的觀點:
這好 OT使用線程局部變量,如果關鍵是要解決併發問題。例如,避免同步an object that is not thread-safe by keeping one copy per thread。或者解決與併發有關的其他設計問題。
它是壞的如果重點是以一種便宜的方式「傳遞一個參數」的電話鏈。您應該更好地重構代碼,並將該對象作爲常規方法參數傳遞給調用鏈。
它是好的使用本地線程來存儲某種形式的「當前」上下文,例如,當前請求。
感謝波希米亞對你的迴應。因此,在服務下一個請求時,我不會從threadlocal(之前的請求)獲取舊值。 – Shahul
是的,我認爲你會,因爲服務器傾向於重用線程。 – keuleJ