ThreadLocal中为什么使用弱引用

 ThreadLocal中为什么使用弱引用

补个概念:

ThreadLocalMap中的key就是Entry,Entry是一个弱引用,关联了当前ThreadLocal对象。需要存储的数据为值。调用set方法要传入两个参数ThreadLocal对象和要存入ThreadLocal对象的数据。

如下图:threadLocal.set(new User(1,"main线程对象")); 这行代码(User类是一个自定义类,threadLocal是当前线程)。等于说通过Entry弱引用,既可以找到ThreadLocal对象,又可以找到存放的value值

同理:get方法可以获取数据

为什么ThreadLocal要使用弱引用?

        现在我们调用 threadlocal = null; 使静态变量和ThreadLocal对象之间的强引用关系去掉。现在这个ThreadLocal对象就可以被回收。根据弱引用的特点:假设某个对象只有弱引用关联,该对象是可以被回收的!(假设Entry和ThreadLocal之间使用强引用,没人指向这个ThreadLocal对象,但它还是不能被回收,就出现内存泄漏!)

总结一下使用弱引用的好处:如果ThreadLocal对象不再使用了(不再被引用了)。尽管它还被ThreadLocalMap引用着,它依然可以被回收。

还有一个问题:由于Entry和value之间是强引用,那么这个value对象如何被回收呢?

由于之前ThreadLocal对象已经没有强引用了,它就会被回收。现在调用set/get/remove方法时,发现当前Entry所关联的ThreadLocal已经没有了。这个Entry所关联的value对象也会被回收。

        但如果一直没有调用set、get、remove方法,那么这个Entry和value就一直不会被回收,从而可能导致内存泄漏。如何解决呢?

因此,当我们某个ThreadLocal不再使用了,就要手动调用remove方法将ThreadLocalMap和Entry之间的引用断掉。这样垃圾GC Root找不到这两个对象,就会被垃圾回收了!

总结

相关推荐

  1. ThreadLocal在项目的简单使用

    2024-04-21 12:24:02       54 阅读
  2. 引用、软引用引用和虚引用

    2024-04-21 12:24:02       60 阅读
  3. 深度解析Golang为什么interface是引用类型

    2024-04-21 12:24:02       62 阅读
  4. 引用能指针 weak_ptr

    2024-04-21 12:24:02       51 阅读
  5. 面试宝典:MySQL为什么推荐使用InnoDB存储引擎

    2024-04-21 12:24:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 12:24:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 12:24:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 12:24:02       82 阅读
  4. Python语言-面向对象

    2024-04-21 12:24:02       91 阅读

热门阅读

  1. 如何防止服务器被攻击

    2024-04-21 12:24:02       35 阅读
  2. K8s集群中关于容器的设置

    2024-04-21 12:24:02       49 阅读
  3. 「笔试刷题」:数组中两个字符串的最小距离

    2024-04-21 12:24:02       39 阅读
  4. npm常用命令详解(二)

    2024-04-21 12:24:02       42 阅读
  5. Mysql的ROW_NUMBER()的使用

    2024-04-21 12:24:02       42 阅读
  6. IDM的实用功能

    2024-04-21 12:24:02       117 阅读
  7. 告别慢查询,解密MySQL慢SQL分析定位

    2024-04-21 12:24:02       42 阅读
  8. c++前言

    c++前言

    2024-04-21 12:24:02      36 阅读
  9. IDM的实用功能

    2024-04-21 12:24:02       41 阅读
  10. IDM下载管理工具的详细介绍

    2024-04-21 12:24:02       38 阅读
  11. 2023年图灵奖揭晓,你怎么看?

    2024-04-21 12:24:02       33 阅读
  12. C++恶魔轮盘赌(道具版)

    2024-04-21 12:24:02       38 阅读
  13. 动态切换数据库-抽象工厂模式

    2024-04-21 12:24:02       37 阅读