Hellooo,long time no see!|

fengzeng

园龄:4年10个月粉丝:17关注:5

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

本文作者:fengzeng

本文链接:https://www.cnblogs.com/Fzeng/p/16314614.html

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

posted @   fengzeng  阅读(119)  评论(0编辑  收藏  举报
历史上的今天:
2021-05-26 java生成多级菜单树
2020-05-26 Java中Iterator(迭代器)实现原理
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起