2012-05-15 117 views
5

在類中定義了一個threadlocal變量來維護一些實例。設置和獲取遞歸方法。當請求完成時(我已經用其他方式分析過,我無法清除threadlocal),我無法清除threadlocal變量。如果不清除ThreadLocal變量,會發生什麼情況?

我的問題是,如果我沒有清除每個請求的threadlocal變量,會發生什麼?有什麼影響?

回答

2

如果線程死亡,對ThreadLocal入口的引用也會死亡,因此您的對象(假設沒有其他引用)將被垃圾收集。

只要線程存在,您的對象也一樣。

您必須評估對於長期存在的對象的影響。

+0

感謝波希米亞對你的迴應。因此,在服務下一個請求時,我不會從threadlocal(之前的請求)獲取舊值。 – Shahul

+0

是的,我認爲你會,因爲服務器傾向於重用線程。 – keuleJ

0

您有內存泄漏,並且可能已經設置了ThreadLocal,下次調用代碼時。 ThreadLocals有點代碼味道imo。

9

的Javadoc說:一個線程消失

後,所有線程本地實例 其副本都會被垃圾回收(除非存在對這些副本 其它參考資料)。

例如,the implementation這裏被使用weak references爲重點哈希表支持。在這種情況下,關鍵是線程。如果線程終止,映射中的條目就有資格進行垃圾回收。

只有當系統開始用盡內存空間時,垃圾收集纔可能發生。但是這種考慮適用於系統中的所有對象:何時開始回收對象取決於GC策略,該策略是VM指定的並且可以進行調整。

這是我的線程局部變量的好的和不好的用法的觀點:

  • OT使用線程局部變量,如果關鍵是要解決併發問題。例如,避免同步an object that is not thread-safe by keeping one copy per thread。或者解決與併發有關的其他設計問題。

  • 是壞的如果重點是以一種便宜的方式「傳遞一個參數」的電話鏈。您應該更好地重構代碼,並將該對象作爲常規方法參數傳遞給調用鏈。

  • 是好的使用本地線程來存儲某種形式的「當前」上下文,例如,當前請求。

相關問題