当前位置 : 主页 > 编程语言 > 其它开发 >

关于ThreadLocal最直白的解释

来源:互联网 收集:自由互联 发布时间:2022-05-30
ThreadLocal 底层原理如下: 实线是强引用,虚线是弱引用 Thread 持有 ThreadLocal 对象的引用,ThreadLocalMap 是 Thread 的成员变量,它是一个 Map,key 是 ThreadLocal 对象, value 是我们 set 进去的值

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,对象就会被回收
  • 虚引用:一般我们可以不用太关注,它是记录引用的引用
网友评论