ThreadLocal中为什么要使用弱引用?
ThreadLocal可以在线程中存放线程的本地变量,保证数据的线程安全。
ThreadLocal中是这样去保存对象的:
1、在每个线程中,存放了一个ThreadLocalMap对象,本质上就是一个数组实现的哈希表,里边存放多个Entry对象。
2、每个Entry对象继承自弱引用,内部存放ThreadLocal对象。同时用强引用,引用保存的ThreadLocal对应的value值。
以代码为例:
threadLocal.set(new User(1,"main线程对象"));
获取数据时:
User user = threadLocal.get();
不再使用Threadlocal对象时, threadlocal = null;由于是弱引用,那么在垃圾回收之后,ThreadLocal对象就可以被回收。
此时还有Entry对象和value对象没有能被回收,所以在ThreadLocal类的set、get、remove方法中,在某些特定条件满足的情况下,会主动删除这两个对象。
如果一直不调用set、get、remove方法或者调用了没有满足条件,这部分对象就会出现内存泄漏。强烈建议在ThreadLocal不再使用时,调用remove方法回收将Entry对象的引用关系去掉,这样就可以回收这两个对象了。
# 总结:
当threadlocal对象不再使用时,使用弱引用可以让对象被回收;因为仅有弱引用没有强引用的情况下,对象是可以被回收的。 弱引用并没有完全解决掉对象回收的问题,Entry对象和value值无法被回收,所以合理的做法是手动调用remove方法进行回收,然后再将threadlocal对象的强引用解除。
上次更新: 2025/03/09, 18:29:07