硬核剖析ThreadLocal源碼,面試官看了直呼內行( 四 )

6.6 ThreadLocal為什么會出現內存泄漏?ThreadLocal出現內存泄漏的原因,就是我們使用完ThreadLocal沒有執行remove方法刪除數據 。
具體是哪些數據過多導致的內存泄漏呢?
一個是數組的Entry對象,Entry對象中key、value分別是ThreadLocal實例對象和泛型對象值 。
因為我們在使用ThreadLocal的時候,總愛把ThreadLocal設置成類的靜態變量 , 直到線程生命周期結束,ThreadLocal對象數據才會被回收 。
另一個是數組中Entry對象的value值,也就是泛型對象值 。雖然ThreadLocalMap的key被設置成弱引用,會被GC回收,但是value并沒有被回收 。需要等到下次執行get、set方法遍歷數組 , 遍歷到這個位置,才會刪除這個無效的value 。這也是造成內存泄漏的原因之一 。
6.7 怎么實現父子線程共享ThreadLocal數據?只需要InheritableThreadLocal即可 , 當初始化子線程的時候,會從父線程拷貝ThreadLocal數據 。
/** * @author 一燈架構 * @apiNote ThreadLocal示例 **/public class ThreadLocalDemo {// 1. 創建可被子線程繼承數據的ThreadLocalstatic ThreadLocal<String> threadLocal = new InheritableThreadLocal<>();public static void main(String[] args) {// 2. 給ThreadLocal賦值threadLocal.set("關注公眾號:一燈架構");// 3. 啟動一個子線程,看是否能獲取到主線程數據new Thread(() -> {System.out.println(threadLocal.get()); // 輸出 關注公眾號:一燈架構}).start();}}

我是「一燈架構」,如果本文對你有幫助,歡迎各位小伙伴點贊、評論和關注,感謝各位老鐵,我們下期見

硬核剖析ThreadLocal源碼,面試官看了直呼內行

文章插圖
【硬核剖析ThreadLocal源碼,面試官看了直呼內行】

推薦閱讀