1、ThreadLocal 的用途
給每個線程提供自己獨立的變量副本,實現線程間隔離。
常用于:
- 數據庫連接、Session 緩存、用戶上下文(如 userId)
- 線程池中的線程復用時避免共享污染;
- 實現線程封閉的設計模式
2、內存泄漏
使用弱引用作為 ThreadLocal 的鍵可以防止內存泄漏。若 Threadlocal 實例被不再需要的線程持有為強引用,那么當該線程結束時,相關的 ThreadLocal 實例及其對應的數據可能無法被回收,導致內存持續占用。而弱引用允許垃圾回收器在內存不足時回收對象。這樣,當沒有其他強引用指向某個 Threadlocal 實例時,它可以被及時回收,避免長時間占用內存。
如果使用強引用,可能有人會說那線程被回收之后就好了呀。重點來了!線程在我們應用中,常常是以線程池的方式來使用的,比如 Tomcat 的線程池處理了一堆請求,而線程池中的線程一般是不會被清理掉的,所以這個引用鏈就會一直在,那么 ThreadLocal對象即使沒有用了,也會隨著線程的存在,而一直存在著!
所以這條引用鏈需要弱化一下,而能操作的只有 Entry 和 key 之間的引用,所以它們之間用弱引用來實現。