threadLocal和threadLocalMap:
用途:放入到threadlocalMap對象中,同一個線程thread在任何地方都可以拿出來
理解(參考源碼):
每個線程thead對象具有一個自己的threadLocalMap對象
threadLocalMap類的定義在threadLocal類中,是threadLocal類的靜態內部類,屬於threadLocal類,而不是屬於threadLocal對象
在threadLocal類中的方法創建threadLoalMap對象,賦予給thread對象(若thread對象中已有threadLocalMap對象,則直接取即可)
threadLocalMap對象的元素entry的key是threadLocal對象,value是需要存儲的數據,可以具有多個threadLocal對象(多個不同key)及對應的value數據
entry的key是一個弱引用的ThreadLocal對象(弱引用對象存活到下一次垃圾回收發生前),所以垃圾回收之前會清除entry對象的key,則會出現key為null的entry,但value所占內存不會釋放,則可能會出現內存泄露(無法釋放已申請的內存空間),最終導致內存溢出(沒有內存可以分配給新的對象)。在ThreadLocal類的get()、set()、remove()方法,均有實現回收 key 為 null 的 Entry 的 value所占的內存。所以為了防止內存泄露,當線程任務不會再用ThreadLocal對象的末尾,調用一次上述三個方法的其中一個即可。個人理解其實線程死亡時會回收所有內存。
//注意,在web中,由於tomcat線程重用,如果用戶信息存在threadLocalMap對象中,則一個請求結束后必須要清空
附:
強引用: 不會被回收的內存。
軟引用: 內部不足的時候回收的內存。
弱引用: 存活到垃圾回收前的內存。