ThreadLocal使用弱引用的原因


threadLocal 中為什么使用弱引用

為什么ThreadLocalMap和HashMap的key不同,會設計成弱引用呢?我們來分析一下:

  • HashMap被程序員使用存儲各類數據,ThreadLocalMap為靜態訪問修飾符為Default的類,只為線程Thread存儲數據(其屬性)。

  • 看一下類注釋:To help deal withvery large and long-lived usages, the hash table entries use WeakReferences for keys。解釋一下:為了幫助處理巨大和長時間存活的對象使用,才會使用弱引用。

所以總結上面兩點,我們就知道。ThreadLocalMap不像HashMap一樣被外部使用,可以認為是線程私有的Map,這就意味着:在線程長時間存活的情況下,如果ThreadLocalMap沒有使用弱引用,而是使用HashMap的話。當Map中被放入大量大對象和值時,又不及時手動刪除K-V的話就很可能會出現應用堆棧溢出的情況。但是如果使用弱引用的話,那么在沒有其他強引用的時候,就不需要程序員手動去刪除K-V,再一定程度上會降低堆棧溢出的風險(要是KEY都被外部強引用,那也沒辦法啊)。

ThreadLocalMap的每次get、set、remove,都會清理過期的Entry,如果不調用remove則會導致value不會被GC回收

ThreadLocalMap的每次get、set、remove,都會清理過期的Entry(key為null的entry)

參考文檔:

https://www.cnblogs.com/-beyond/p/13125195.html#ask

https://segmentfault.com/a/1190000024549972


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM