java教程:十分钟理解Java中的弱引用
1. What——什么是弱引用?
Java中的弱引用具体指的是java.lang.ref.WeakReference<T>类,我们首先来看一下官方文档对它做的说明:
强引用(Strong Reference):通常我们通过new来创建一个新对象时返回的引用就是一个强引用,若一个对象通过一系列强引用可到达,它就是强可达的(strongly reachable),那么它就不被回收
软引用(Soft Reference):软引用和弱引用的区别在于,若一个对象是弱引用可达,无论当前内存是否充足它都会被回收,而软引用可达的对象在内存不充足时才会被回收,因此软引用要比弱引用“强”一些
虚引用(Phantom Reference):虚引用是Java中最弱的引用,那么它弱到什么程度呢?它是如此脆弱以至于我们通过虚引用甚至无法获取到被引用的对象,虚引用存在的唯一作用就是当它指向的对象被回收后,虚引用本身会被加入到引用队列中,用作记录它指向的对象已被销毁。
2. Why——为什么使用弱引用?
考虑下面的场景:现在有一个Product类代表一种产品,这个类被设计为不可扩展的,而此时我们想要为每个产品增加一个编号。一种解决方案是使用HashMap<Product, Integer>。于是问题来了,如果我们已经不再需要一个Product对象存在于内存中(比如已经卖出了这件产品),假设指向它的引用为productA,我们这时会给productA赋值为null,然而这时productA过去指向的Product对象并不会被回收,因为它显然还被HashMap引用着。所以这种情况下,我们想要真正的回收一个Product对象,仅仅把它的强引用赋值为null是不够的,还要把相应的条目从HashMap中移除。显然“从HashMap中移除不再需要的条目”这个工作我们不想自己完成,我们希望告诉垃圾收集器:“在只有HashMap中的key在引用着Product对象的情况下,就可以回收相应Product对象了。” 显然,根据前面弱引用的定义,使用弱引用能帮助我们达成这个目的。我们只需要用指向Product对象的弱引用对象来作为HashMap中的键就可以了。
3. How——如何使用弱引用?
拿上面介绍的场景举例,我们使用一个指向Product对象的弱引用对象来作为HashMap的键,只需这样定义这个弱引用对象:
productA = new Product(...);
WeakReference<Product> weakProductA = new WeakReference<>(productA);
现在,若引用对象weakProductA就指向了Product对象productA。那么我们怎么通过weakProduct获取它所指向的Product对象productA呢?很简单,只需要下面这句代码:
Product product = weakProductA.get();
实际上,对于这种情况,Java类库为我们提供了WeakHashMap类,使用和这个类,它的键自然就是弱引用对象,无需我们再手动包装原始对象。这样一来,当productA变为null时(表明它所引用的Product已经无需存在于内存中),这时指向这个Product对象的就是由弱引用对象weakProductA了,那么显然这时候相应的Product对象时弱可达的,所以指向它的弱引用会被清除,这个Product对象随即会被回收,指向它的弱引用对象会进入引用队列中
下面我们来简单地介绍下引用队列的概念。实际上,WeakReference类有两个构造函数:
WeakReference(T referent)//创建一个指向给定对象的弱引用
WeakReference(T referent, ReferenceQueue<? super T> q) //创建一个指向给定对象并且登记到给定引用队列的弱引用
我们可以看到第二个构造方法中提供了一个ReferenceQueue类型的参数,通过提供这个参数,我们便把创建的弱引用对象注册到了一个引用队列上,这样当它被垃圾回收器清除时,就会把它送入这个引用队列中,我们便可以对这些被清除的弱引用对象进行统一管理。
java教程:十分钟理解Java中的弱引用相关推荐
- java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用
十分钟理解Java中的弱引用,十分钟java引用 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限 ...
- 十分钟理解Java泛型擦除
泛型信息只存在于代码编译阶段,但是在java的运行期(已经生成字节码文件后)与泛型相关的信息会被擦除掉,专业术语叫做类型擦除. 今天我们来讲解泛型中另一个重要知识点--泛型擦除! 泛型擦除概念 泛型信 ...
- java actor_十分钟理解Actor模式
Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing.所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor.共享内存更适合单 ...
- 十分钟理解javascript中的this对象
最近在参加的几场面试中都涉及到了对于js中this对象的理解,那么怎样去理解this呢?这里针对不同的场景通过代码来帮助我们理解好this. this到底指向什么? this指向什么呢?一言以蔽之: ...
- java的弱引用_深入理解Java中的弱引用
不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?& ...
- 一分钟理解Java包装类型
转载自 一分钟理解Java包装类型 Java 一直标榜自己是一个纯粹的面向对象语言,自作聪明的为所有的值类型都提供相应的引用类型(不明白这两个概念,看之前的<一分钟理解传值和传引用>)比 ...
- 一分钟理解Java公平锁与非公平锁
转载自 一分钟理解Java公平锁与非公平锁 和朋友聊天他提到:ReentrantLock 的构造函数可以传递一个 bool 数据,true 时构造的是"公平锁".false 时构 ...
- 理解Java中的弱引用(Weak Reference)
理解Java中的弱引用(Weak Reference) 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限, ...
- java 获取td_[Java教程]jQuery获取table表中的td标签
[Java教程]jQuery获取table表中的td标签 0 2017-07-28 00:00:08 首先我来介绍一下我遇到的问题 1.当有一个table表包含了 标签,标签,大致可以认为是这样的: ...
- java 普通类request_[Java教程]spring在普通类中获取session和request
[Java教程]spring在普通类中获取session和request 0 2014-08-12 08:01:13 在使用spring时,经常需要在普通类中获取session,request等对像. ...
最新文章
- windows中使用git和开源中国
- 判断图有无环_链表:环找到了,那入口呢?
- hdu5348 MZL's endless loop(欧拉回路)
- MySQL从服务器写入报错吗_MySQL主从复制读写分离及奇怪的问题
- Java如何控制用户输入的长度,用Java Applet 进行Web编程时,如何限制输入域中可输入字符的长度!解决后马上给分!!!...
- IIS内部错误:500之解决方案
- 【LeetCode】【HOT】617. 合并二叉树(递归)
- 总结一下linux中的分段机制
- 超级压缩,将3D压缩成一种图片
- android状态栏右上角增加图标的方法
- css flex所有属性总结
- 为什么CPU需要时钟才能工作
- 怎么还原计算机字体库,如何在XP系统中恢复字库文件?WinXp系统恢复字库文件图文教程...
- 安装VS2010的SP1补丁的办法
- 如何通过轨迹信息判断驾驶人是否为同一人?
- 电脑桌面里的计算机里的软件是啥,屏幕尺子有哪些?电脑屏幕尺子软件推荐
- 2022怎么样做好网站的SEO优化?
- mysql aes encrypt_MySQL如何正确地利用AES_ENCRYPT()与AES_DECRYPT()加解密
- 【阅读笔记】机器阅读理解(中)——架构篇
- UGUI学习笔记(十二)自制血条控件