• 关于ThreadLocal最直白的解释


    ThreadLocal 底层原理如下:
    image.png
    实线是强引用,虚线是弱引用
    Thread 持有 ThreadLocal 对象的引用,ThreadLocalMap 是 Thread 的成员变量,它是一个 Map,key 是 ThreadLocal 对象, value 是我们 set 进去的值
    和 Map 一样,每一对 key:value 封装成了一个 Entry 对象,它的 key 是虚引用,也就是上图的虚线
    image.png
    这里为什么是虚引用?如果是强引用会发生什么问题?
    假设 Entry 是强引用,那么当线程执行完毕后,就会变成下面这样
    image.png
    ThreadLocal 没有被使用,但是也无法被 JVM 回收,导致内存泄漏
    如果是虚引用的话,当线程结束后,ThreadLocal 会被 JVM 回收,如下所示
    image.png
    这就引出了为什么我们使用完 ThreadLocal 后需要将 remove 操作
    如果不进行 remove ,会堆积很多 null:value 的 Entry 导致内存泄漏
    顺带提一下 Java 中的四种引用:

    • 强引用:new 出来的都是强引用类型,只要当它没有引用时才会被 JVM 回收
    • 软引用:在内存足够的情况下,即便没有引用也不会被回收,内存不足时,就算有引用也会被回收
    • 弱引用:只要发生 GC,对象就会被回收
    • 虚引用:一般我们可以不用太关注,它是记录引用的引用
  • 相关阅读:
    增加文章
    网站之注册
    C#常用的引用
    Session.Abandon和Session.Clear有何不同 (转)
    C#文件路径的写法
    UpdatePanel的用法详解
    [转]asp:ScriptManager
    Git 常用命令
    AJAX请求 $.post方法的使用
    a 标签中调用js的几种方法
  • 原文地址:https://www.cnblogs.com/Fzeng/p/16314614.html
Copyright © 2020-2023  润新知