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