当前位置: 首页 > news >正文

硬引用、软引用、弱引用、虚引用和原子引用

以下是不同类型引用的详细信息,通过表格展示原理、作用、使用场景和优缺点:

引用类型原理作用使用场景优点缺点
硬引用默认的引用类型,只要有硬引用指向对象,垃圾收集器就不会回收该对象。确保对象在程序运行过程中一直存在。普通对象引用,任何时候需要确保对象不被垃圾回收。简单直接,确保对象存活。可能导致内存泄漏,如果对象不再需要但仍然被引用,将占用内存。
软引用相对较弱的引用类型,当内存不足时,垃圾收集器会回收这些被软引用的对象。适用于缓存,允许在内存充足时保留对象,但在内存不足时可以被回收。缓存系统,如图片缓存、对象池等。提高内存利用率,在内存不足时回收对象。在内存紧张时,可能会被回收,无法保证对象一定存活。
弱引用比软引用更弱的引用类型,只要垃圾收集器运行,不管内存是否充足,都会回收被弱引用的对象。适用于需要快速回收的对象,如缓存中的键、监听器等。弱键缓存、事件监听机制。允许对象快速回收,避免内存泄漏。对象存活时间短,可能会被频繁回收。
虚引用最弱的一种引用类型,主要用于跟踪对象的垃圾回收状态。虚引用必须与引用队列一起使用。跟踪对象的回收状态,通常用于实现一些特定的清理机制。管理直接内存,清理资源,确保某些资源在对象被回收后正确释放。允许在对象回收时进行后续操作。复杂,需要与引用队列配合使用。
AtomicReference提供原子性操作的引用类型,确保在多线程环境下引用的操作是线程安全的。确保多线程环境中的引用更新操作是原子的,无需显式同步。多线程环境下需要线程安全地更新引用的场景,如并发数据结构、无锁算法等。提供线程安全的引用操作,简化多线程编程。在某些高并发情况下,性能可能不如锁机制。

示例代码

硬引用:

Object obj = new Object();

软引用:

SoftReference<MyObject> softRef = new SoftReference<>(new MyObject());

弱引用:

WeakReference<MyObject> weakRef = new WeakReference<>(new MyObject());

虚引用:

ReferenceQueue<MyObject> queue = new ReferenceQueue<>();
PhantomReference<MyObject> phantomRef = new PhantomReference<>(new MyObject(), queue);

AtomicReference:

AtomicReference<MyObject> atomicRef = new AtomicReference<>(new MyObject());

这些引用类型帮助开发者在不同的场景下有效地管理内存和处理并发问题,通过合理选择引用类型,可以提高程序的性能和可靠性。
联系我

相关文章:

  • 架构风格-系统架构师(十五
  • Pipeline知识小记
  • 复分析——第6章—— Γ 函数和 ζ 函数(E.M. Stein R. Shakarchi)
  • PCL 点云RANSAC+SVD提取平面
  • 一文了解HarmonyOSNEXT发布重点内容
  • ubuntu22.04安装onlyoffice社区版
  • React-配置json-server
  • 认识和使用 Vite 环境变量配置,优化定制化开发体验
  • 鸿蒙NEXT开发中的知识:构建自己的ArkTS应用工程(Stage模型)
  • Redis面试题自测
  • leetcode34:在排序数组中查找元素的第一个和最后一个位置
  • JMeter的基本使用与性能测试,完整入门篇保姆式教程
  • Stable Diffusion 3 大模型文生图“开源英雄”笔记本部署和使用教程,轻松实现AI绘图自由
  • Aidlux 1.4 部署homeassistant core 2024.6实录
  • java试卷练习1
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [译] 怎样写一个基础的编译器
  • 《深入 React 技术栈》
  • Invalidate和postInvalidate的区别
  • Javascript设计模式学习之Observer(观察者)模式
  • JDK 6和JDK 7中的substring()方法
  • Mysql5.6主从复制
  • mysql中InnoDB引擎中页的概念
  • PHP CLI应用的调试原理
  • spark本地环境的搭建到运行第一个spark程序
  • SQLServer之创建数据库快照
  • v-if和v-for连用出现的问题
  • Vue.js 移动端适配之 vw 解决方案
  • webpack+react项目初体验——记录我的webpack环境配置
  • windows-nginx-https-本地配置
  • 大整数乘法-表格法
  • 基于游标的分页接口实现
  • 解析带emoji和链接的聊天系统消息
  • 强力优化Rancher k8s中国区的使用体验
  • 算法---两个栈实现一个队列
  • hi-nginx-1.3.4编译安装
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #etcd#安装时出错
  • $forceUpdate()函数
  • (2)MFC+openGL单文档框架glFrame
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (c语言+数据结构链表)项目:贪吃蛇
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (done) 声音信号处理基础知识(4) (Understanding Audio Signals for ML)
  • (Java)【深基9.例1】选举学生会
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (六)Hibernate的二级缓存
  • (三)uboot源码分析
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (算法)硬币问题
  • .Net IOC框架入门之一 Unity
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET/C# 的字符串暂存池