有关ThreadLocal的内存泄漏简单理解

ThreadLocal

ThreadLocal没什么神秘的,他就是每个线程私有的一个变量而已。
每个线程都包含一个ThreadLocalMap类型的成员变量,该Map的每个Entry中,key-value的关系就是ThreadLocal-value的关系
ThreadLocal提供了get和set方法
当使用Set方法的时候,ThreadLocal会获取当前线程的对象,然后获取当前线程的ThreadLocalMap对象,然后再去以当前的ThreadLocal作为key去set一个值
当使用get方法的时候,ThreadLocal会获取当前的线程对象,然后获取当前线程的ThreadLocalMap对象,最后再用当前的ThreadLocal作为key去获取一个值

弱引用

Entry中的key是持有的对ThreadLocal的弱引用,也就是每一次GC的时候ThreadLocal在不存在强引用的关系下就会被回收♻️,但是Entry中的value却不会被回收♻️
所以每次使用完ThreadLocal的时候,需要再调用一下get/set/remove方法,都可以自动清除这个遗留的value

为何不是强引用

如果使用强引用的话,这个ThreadLocal对象永远不会被回收的,因为Entry中key是持有的ThreadLocal的强引用,只有在remove之后ThreadLocal才有可能被回收,否则的话容易造成OOM

本文作者:mirage_mc

本文链接:https://www.cnblogs.com/mirage-mc/p/15992040.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   mirage_mc  阅读(54)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.