硬核剖析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源码,面试官看了直呼内行】

推荐阅读