系列九、Entry的key为什么要设计成弱引用

一、Entry的key为什么要设计成弱引用

1.1、四大引用类型

Java中的四种引用

1.2、Entry源码

1.3、为什么设计为弱引用

1.3.1、官网

To help deal with very large and long-lived usages, the hash table entries use WeakReferences for keys。

1.3.2、ThreadLocal引用示意图

 

再说ThreadLocal的key设计为弱引用之前,先来说说如果设计为强引用,会有什么问题?

key使用强引用:假设在业务代码中使用完ThreadLocal,ThreadLocal中的ref被回收了,但是因为ThreadLocalMap的Entry的key强引用了ThreadLocal,造成ThreadLocal无法回收,在没    有删除这个Entry以及当前线程依然在运行的前提下,始终有一条强引用链,即:Thread ref===>Thread obj===>ThreadLocalMap obj===>Entry,Entry就不会被回收(Entry中包括ThreadLocal实例和value),导致Entry内存泄漏;

key使用弱引用:同样假设在业务代码中使用完ThreadLocal,ThreadLocal ref被回收了,由于ThreadLocalMap的Entry的key使用的是弱引用,当gc时ThreadLocal obj能够顺利被回收,此时Entry中的key为null,但是在没有手动删除这个Entry以及当前线程依然在运行的前提下,也始终存在着一条强引用链,即:Thread ref===>Thread obj===>ThreadLocalMap obj===>Entry===>value,value不会被回收,而这块value永远不会被访问到了,导致value内存泄漏;

总结:既然key设计为强引用和弱引用都有可能出现内存泄漏的问题,那么为什么要设计为强引用呢?事实上,在ThreadLocalMap中的set()、getEntry() 方法中,会对key是否为null(key为ThreadLocal)进行判断,如果key为null的话,那么会对value设置为null,这就意味着使用完ThreadLocal,当前线程依然运行的前提下,就算忘记调用remove()方法了,弱引用也比强引用多一层保障,所引用的key(ThreadLocal)会被回收,对应的value会在下次ThreadLocalMap中调用set()、getEntry()、remove()中的任一方法时都会被清除,从而避免内存泄露。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一练 | 华为认证真题练习Day135

1、如果一个以太网数据帧的Length/Tyme0z8100,那么这个数据帧的载荷可能是?(多选) A. TCP数据段 B. UDP数据 C. ICMP报文 D. ARP报文 2、如图所示,路由器R1上部署了静态NAT命令,当PC访问互联网时&#…

【iOS】知乎日报

文章目录 前言一、首页1.网络的异步请求2.避免同一网络请求执行多次3.下拉刷新与上拉加载的实现下拉刷新上拉加载 二、网页1.webView的实现2.webView的滑动加载3.网页与首页内容的同步更新 三、评论区Masonory实现行高自适应 四、收藏中心通过FMDB实现数据持久化1.创建或打开数…

python中的exec()、eval()以及complie()

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 1.eval函数 函数的作用: 计算指定表达式的值。 也就是说它要执行的python代码只能是单个表达式(注意eval不支持任何形式的赋值操作&…

蓝桥等考C++组别八级001

第一部分:选择题 1、C++ L8 (15分) 整数12,18的最大公约数(公因数)是( )。 A. 3 B. 4 C. 6 D. 36 正确答案:C

docker部署ETC(以太经典)主网链

文章目录 一、ETC镜像下载二、ETC容器生成三、查看ETC服务是否部署成功四、查看etc主网节点是否同步完成一、ETC镜像下载 下载以太经典基础镜像docker pull etclabscore/core-geth:version-1.11.22二、ETC容器生成 新建ETC数据目录mkdir -p /opt/docker/public-etcETC容器启动命…

git命令 cherry-pick

参考:https://blog.csdn.net/weixin_42585386/article/details/128256149 https://blog.csdn.net/weixin_44799217/article/details/128279250 merge和cherry-pick的区别: merge:是把某一个代码分支完全合并到当前的代码分支。完全合并的意…

TensorFlow实战教程(一)-TensorFlow环境部署

从本篇文章开始,作者正式开始研究Python深度学习、神经网络及人工智能相关知识。第一篇文章主要讲解神经网络基础概念,同时讲解TensorFlow2.0的安装过程及基础用法,主要结合作者之前的博客和"莫烦大神"的视频介绍,后面随着深入会讲解具体的项目及应用。基础性文章…

代码随想录刷题】Day17 二叉树04

文章目录 1.【110】平衡二叉树(优先掌握递归)1.1 题目描述1.2 解题思路1.3 java代码实现 2.【257】二叉树的所有路径(优先掌握递归)2.1 题目描述2.2 解题思路2.3 java代码实现 3.【404】左叶子之和(优先掌握递归&#…

python tkinter 使用(二)

python tkinter 使用(二) 本篇文章着重讲下tkinter中messagebox的使用。 1:提示框 def showinfo(event):messagebox.showinfo("这是个提示框","this is message content")2:错误提示框 def showerror(event):messagebox.showerr…

C# Dictionary的使用

在 C# 中&#xff0c;Dictionary 是一种常用的数据结构&#xff0c;用于存储键值对。以下是一些常见的 Dictionary 操作&#xff1a; 创建和初始化一个 Dictionary 可以使用以下代码创建并初始化一个 Dictionary&#xff1a; Dictionary<string, int> dict new Dicti…

opencv-重点知识

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;提供了大量用于图像处理和计算机视觉任务的工具和算法。以下是一些OpenCV中的重点知识&#xff1a; 图像加载与显示: 使用cv2.imread()加载图像。使用cv2.imshow()显示…

Spring 配置

配置文件最主要的目的 : 解决硬编码的问题(代码写死) SpringBoot 的配置文件,有三种格式 1.properties 2.yaml 3.yml(是 yaml 的简写) SpringBoot 只支持三个文件 1.application.properties 2.application.yaml 3.application.yml yaml 和 yml 是一样的,学会一个就行…

极智开发 | CUDA Compiler NVCC编译流程

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 CUDA Compiler NVCC编译流程。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq CUDA 代码是传统 C++ host 和 …

一文让你上手Linux常用命令(考前十分钟快速突击+零基础阅读)

文章目录 前言Linux 常用命令1. 基本操作lscdpwd 2. 对文件的操作touchcatechovim 3. 对目录的操作mkdirrm 4. 移动文件 / 目录的操作cpmv 5. 总结基本操作6. 必不可少的实用操作mangreppsnetstat 总结 前言 本文内容为 Linux 的一些超常用命令, 内容不多且十分实用, 这些命令…

SELinux零知识学习二十二、SELinux策略语言之类型强制(7)

接前一篇文章&#xff1a;SELinux零知识学习二十一、SELinux策略语言之类型强制&#xff08;6&#xff09; 二、SELinux策略语言之类型强制 3. 访问向量规则 AV规则就是按照对客体类别的访问许可指定具体含义的规则&#xff0c;SELinux策略语言目前支持四类AV规则&#xff1a…

三、Keil安装芯片包、下载固件库、建立STM32工程模板

目录 一、首先在Keil软件上安装好芯片包 二、下载官方固件库 三、建立基于固件库的Keil5工程模板 一、首先在Keil软件上安装好芯片包 STM32有很多系列的芯片&#xff0c;我们平常用的最多的是STM32F1系列的&#xff0c;因此安装F1系列的芯片包在我们初学时&#xff0c;只按照…

Mybatis Plus—数据安全保护、批量操作

一、数据安全保护 该功能为了保护数据库配置及数据安全&#xff0c;在一定的程度上控制开发人员流动导致敏感信息泄露。 3.3.2 开始支持配置安全 YML 配置&#xff1a; // 加密配置 mpw: 开头紧接加密内容&#xff08; 非数据库配置专用 YML 中其它配置也是可以使用的 &…

设计模式系列:三、责任链设计模式

一、概述 责任链模式是一种行为设计模式&#xff0c;它允许多个对象处理一个请求&#xff0c;从而避免了请求的发送者和接收者之间的耦合关系。 优点是把任务划分为一个一个的节点&#xff0c;然后按照节点之间的业务要求、顺序&#xff0c;把一个个节点串联起来&#xff0c;…

如何使用浏览器自动化框架Playwright开发“万媒易发”实现多平台自动发布文章?

作为一名程序员和开发者&#xff0c;我深知在多个媒体平台手动发布和管理文章的痛苦。因此&#xff0c;我决定使用Playwright浏览器自动化框架&#xff0c;开发一款名为“万媒易发”的工具&#xff0c;实现多平台自动发布文章。下面我将分享这款工具的开发过程和成果&#xff0…

浅析教学型数控车床使用案例

教学型数控车床是一种专为教学和培训设计的机床&#xff0c;它具有小型化、高精度和灵活性的特点&#xff0c;可以作为学校和技术学院的培训机器。下面是一个使用案例&#xff0c;以展示教学型数控车床在教学实训中的应用。 案例背景&#xff1a; 某职业技术学院的机械工程专业…