关于ThreadLocalMap中的key被会回收的问题

来源:5-22 总结_

宝慕林5249423

2020-01-08

老师在视频中讲到:图片描述
也就是说在ThreadLocalMap的成员变量“private Entry[] table”中,其key是弱引用,所以gc能够回收这个key,也就是说这key已经变成null值了,但是,在这个时候,我需要得到threadlocal对应的value值就得不到了,这是不应该的,在这里我有点不明白,望老师解答一下

写回答

1回答

悟空

2020-01-08

正常情况下,是存在这一个ThreadLocal对象的强引用的,在threadlocal的生命周期中,都存在这些引用. 看下图: 实线代表强引用,虚线代表弱引用:

//img.mukewang.com/szimg/5e15e9ee096ba08d17920922.jpg

每个thread中都存在一个map, map的类型是ThreadLocal.ThreadLocalMap. Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对key. 每个key都弱引用指向threadlocal. 这句话是重点:当把threadlocal实例置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal将会被gc回收.

但是,我们的value却不能回收,因为存在一条从current thread连接过来的强引用. 只有当前thread结束以后, current thread就不会存在栈中,强引用断开, Current Thread, Map, value将全部被GC回收.所以得出一个结论就是只要这个线程对象被gc回收,就不会出现内存泄露,但在threadLocal设为null和线程结束这段时间不会被回收的,就发生了我们认为的内存泄露。


所以,当key为null的时候,其实是我们已经不需要这个ThreadLocal对象了,那么就不存在这个问题:

在这个时候,我需要得到threadlocal对应的value值就得不到了,这是不应该的

参考:https://www.cnblogs.com/aspirant/p/8991010.html

1
1
宝慕林5249423
非常感谢悟空老师!
2020-01-09
共1条回复

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程