Java中四种引用类型【快速理解】图文

一、强引用

        我们正常手动new出来的对象都是强应用,不对他进行别的操作的时候它是不会进行垃圾回收的。除非将它的引用断开,此时调用垃圾回收器才会将它回收。

二、软引用

三、虚引用

        虚引用的意思就是,引用关系是虚的,如果创造出来,就连获取对象都获取不到,只有空间不足垃圾回收的时候,会放到一个引用队列里进行通知垃圾回收器特殊处理。

        既然用都用不到这个在实际中有啥用呢?

        有一个是从网线上传来一个对象数据,然后网线传送到网卡,网卡到内存中,内存到jvm中的堆空间里,其中内存到JVM是纯纯复制的一个过程,所以后把jvm里的buffer换成directBuffer直接内存,直接使用这个对象的时候直接从内存中获取提高效率,但是这块内存是不归jvm管,不归jvm管就没办法直接使用垃圾回收器处理,那么正好可以用虚引用,垃圾回收器将directBuffer垃圾回收的时候加入到弱引用队列进行统一的特殊处理。

四、弱引用

        这个弱引用是可以拿到对象的,特点就是只要是垃圾回收器看到弱引用就直接无视,将对应的对象当成垃圾。面试最常考的地方是下面这个threadlocal中的弱引用部分。

 ThreadLocal实际上是一个对外暴露的操作当前线程Thread中ThreadLocalMap的一个工具类,ThreadLocalMap里可以存储Entry,Entry里的key对应着当前线程实例对象,value对应着我们设置的值。其中ThreadLocalMap存储在当前Thread线程类中,所以每个线程中使用ThreadLocal获取的数据也是不同的,隔离性也是再此产生的。

        就一句话的事,一个线程对应的一个ThreadLocalMap,根据线程的名字就可以获取到属于自己线程的ThreadLocalMap,一个ThreadLocalMap可以存多个值,每个值都是一个entry对象,key是对应创建的ThreadLocal对象,value随便,如果在一个线程想设置多个ThreadLocalMap的entry,就创建多个threadlocal对象就行了,这个ThreadLocalMap存在thread类里

        特点:这个entry中的key此处继承了一个弱引用,它将自己的key设置成super(key),把自己的key设置成弱引用。

        先看图,看图说话,先创建属性tl1指向Threadlocal对象,通过Threadlocal 这个对象引用tl1进行put操作的时候,实际上是向entry里的key存进去的是当前这个这个Threadlocal对象引用作为key。很明显我看图就知道,然后根据自己的线程获取到属于自己的ThreadLocalMap,创建对应的ThreadLocalMap空间,ThreadLocalMap里面我们学过里面存的是entry的这种key-value键值对的建构,然后这个entry其实还继承了一个弱引的类,然后会发现key都实现了父类方法,将引用类型设置成弱引用类型。然后通过栈中的成员属性指tl1指向自己创建的Threadlocal对象,这是强引用。

        当我们找对应的Threadlocal,将这个Threadlocal的引用穿进去就可以找到了,因为弱引用是可以获取到对象的。不过为什么这里要用弱引用呢?

        是因为如果Threadlocal这个引用属性想要断开Threadlocal对象的关系,目的是为了让threadlThreadlocalocal对象回收,因为此时不需要用Threadlocal了,此时entry里的key使用的是弱引用,也就是说连接对象的强引用断开了,就剩自己一个弱引用了,那么通过弱引用的特性,垃圾回收器只要看到弱引用就会无视它的引用,执行垃圾回收器的回收,此时就会将这个对象删除。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C语言-详细讲解-洛谷P1075 [NOIP2012 普及组] 质因数分解

1.题目要求 2.题目解析 解题点在于如何分解质因数&#xff0c;这里介绍一下短除法。&#xff08;虽然解决这个问题可以不用短除法&#xff09; 3.代码实现 贴一下自己的代码 #include <stdio.h> #include <math.h>int main() {int n, i;scanf("%d",…

Kubernetes Extended Resource 扩展资源使用简介

Kubernetes 除了提供基于 CPU 和内存的传统计算资源调度外&#xff0c;还支持自定义的 Extended Resource 扩展资源&#xff0c;以便调度和管理其它各种类型的资源。 Extended Resource Extended Resource 扩展资源的创建和使用过程如下图所示&#xff1a; 定义资源&#xff…

javaweb基于springboot社区养老服务管理系统

简介&#xff1a; 系统整体设计分为三个角色&#xff0c;分别是社区员工、社区老人、社区系统管理员。在功能模块上分为三大块&#xff1a;人员管理模块、健康管理模块和活动管理模块。 人员管理模块能够对社区系统管理员信息、社区员工信息、社区老人信息进行管理。健康管理模…

鸿蒙应用App测试-专项测试(DevEco Testing)

注意&#xff1a;大家记得先学通用测试在学专项测试 鸿蒙应用App测试-通用测试-CSDN博客 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&am…

Jenkins应用详解(Detailed Explanation of Jenkins Application)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

《大道平渊》· 廿肆 —— 欲望应当内敛,而非张扬。

《大道平渊》 廿肆 什么是欲望&#xff1f;哲学家德勒兹认为&#xff0c;欲望没有客体。 其本身&#xff0c;就是一种渴望维持自身的运动。 欲望是由生物的本性产生的、想达到某种目的的要求&#xff0c;无善恶之分。 . 那么欲望的本身是什么&#xff1f; 是一种情绪和思想…

支持向量机相关证明 解的稀疏性

主要涉及拉格朗日乘子法&#xff0c;对偶问题求解

ProtoBuf 快速上手

关于 ProtoBuf 的含义和安装推荐看&#xff1a;ProtoBuf 的含义和安装 步骤0&#xff1a;引⼊ ProtoBuf 包 <!-- protobuf ⽀持 Java 核⼼包 --> <dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactI…

apt镜像源制作-ubuntu22.04

# 安装必要的软件 sudo apt-get install -y apt-mirror # 编辑/etc/apt/mirror.list,添加以下内容 set base_path /var/spool/apt-mirror # 指定要镜像的Ubuntu发布和组件-null dir jammy-updates main restricted universe multiverse # 镜像的Ubuntu发布和组件的URL-n…

TLU - Net:一种用于钢材表面缺陷自动检测的深度学习方法

摘要&#xff1a; 钢铁表面缺陷检测是钢铁板制造过程中的一个关键步骤。近年来&#xff0c;已经研究了许多基于机器学习的自动化视觉检测 (AVI) 方法。然而&#xff0c;由于 AVI 方法的训练时间和准确性问题&#xff0c;大多数钢铁制造行业仍然使用人工视觉检测。自动钢铁缺陷检…

设计模式讲解02—责任链模式(Chain)

1. 概述 定义&#xff1a;责任链模式是一种行为型模式&#xff0c;在这个模式中&#xff0c;通常创建了一个接收者对象的链来处理请求&#xff0c;该请求沿着链的顺序传递。直到有对象处理该请求为止&#xff0c;从而达到解耦请求发送者和请求处理者的目的。 解释&#xff1a;责…

Java | Leetcode Java题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; class Solution {static int[][] dirs {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int[][] updateMatrix(int[][] matrix) {int m matrix.length, n matrix[0].length;// 初始化动态规划的数组&#xff0c;所有的距离值都设置为一个很大…

ServletContext介绍

文章目录 1、ServletContext对象介绍1_方法介绍2_用例分析 2、ServletContainerInitializer1_整体结构2_工作原理3_使用案例 3、Spring案例源码分析1_注册DispatcherServlet2_注册配置类3_SpringServletContainerInitializer 4_总结 ServletContext 表示上下文对象&#xff0c;…

virtualBox部署minikube+istio

环境准备 virtualBox安装 直接官网下载后安装即可&#xff0c;网上也有详细教程。镜像使用的centos7。 链接&#xff08;不保证还可用&#xff09;&#xff1a;http://big.dxiazaicc.com/bigfile/100/virtualbox_v6.1.26_downcc.com.zip?auth_key1730185635-pWBtV8LynsxPD0-0-…

QT 实现绘制汽车仪表盘

1.界面实现效果 以下是具体的项目需要用到的效果展示,通常需要使用QPainter类来绘制各种图形和文本,包括一个圆形的仪表盘、刻度、指针和数字。 2.简介 分为以下几个部分,首先设置抗锯齿 painter.setRenderHint(QPainter::Antialiasing)。 QPainter p(this);p.setRender…

Node.js——fs模块-文件读取

1、文件读取&#xff1a;通过程序从文件中去除其中的数据 2、方法 方法 说明 readFile 异步读取 readFileSync 同步读取 createReadStrean 流式读取 3、readFile 异步读取 语法&#xff1a; 本文的分享到此结束&#xff0c;欢迎大家评论区一同讨论学习&#xff0c;下一…

cv2.threshold利用OSTU方法分割图像的前景和背景

OSTU方法&#xff0c;又称大津法或最大类间方差法&#xff0c;是一种在图像处理中广泛应用的自动阈值选择方法。该方法由日本学者大津&#xff08;Nobuyuki Otsu&#xff09;于1979年提出&#xff0c;旨在通过最大化前景与背景之间的类间方差来自动确定一个最佳阈值&#xff0c…

Perforce《2024游戏技术现状报告》Part2:游戏引擎、版本控制、IDE及项目管理等多种开发工具的应用分析

游戏开发者一直处于创新前沿。他们的实践、工具和技术受到各行各业的广泛关注&#xff0c;正在改变着组织进行数字创作的方式。 近期&#xff0c;Perforce发布了《2024游戏技术现状报告》&#xff0c;通过收集来自游戏、媒体与娱乐、汽车和制造业等高增长行业的从业者、管理人…

编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析&#xff1a;imx_pinctrl_soc_info结构体Pinctrl子系统中c…

数据结构代码题--排序算法(快排),二叉树的基本知识,链表的基本操作引申

排序算法&#xff1a; 完成比完美更重要&#xff01; 题目中常考的是平均时间复杂度&#xff1a;但是具体计算时&#xff0c;能用最坏就用最坏 插入&#xff1a;直接插&#xff0c;希尔 交换&#xff1a;冒泡&#xff0c;快排 选择&#xff1a;简单选择&#xff0c;堆排 归…