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中的弱引用相关推荐

  1. java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用

    十分钟理解Java中的弱引用,十分钟java引用 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限 ...

  2. 十分钟理解Java泛型擦除

    泛型信息只存在于代码编译阶段,但是在java的运行期(已经生成字节码文件后)与泛型相关的信息会被擦除掉,专业术语叫做类型擦除. 今天我们来讲解泛型中另一个重要知识点--泛型擦除! 泛型擦除概念 泛型信 ...

  3. java actor_十分钟理解Actor模式

    Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing.所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor.共享内存更适合单 ...

  4. 十分钟理解javascript中的this对象

    最近在参加的几场面试中都涉及到了对于js中this对象的理解,那么怎样去理解this呢?这里针对不同的场景通过代码来帮助我们理解好this. this到底指向什么? this指向什么呢?一言以蔽之: ...

  5. java的弱引用_深入理解Java中的弱引用

    不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?& ...

  6. 一分钟理解Java包装类型

    转载自  一分钟理解Java包装类型 Java 一直标榜自己是一个纯粹的面向对象语言,自作聪明的为所有的值类型都提供相应的引用类型(不明白这两个概念,看之前的<一分钟理解传值和传引用>)比 ...

  7. 一分钟理解Java公平锁与非公平锁

    转载自  一分钟理解Java公平锁与非公平锁 和朋友聊天他提到:ReentrantLock 的构造函数可以传递一个 bool 数据,true 时构造的是"公平锁".false 时构 ...

  8. 理解Java中的弱引用(Weak Reference)

    理解Java中的弱引用(Weak Reference) 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限, ...

  9. java 获取td_[Java教程]jQuery获取table表中的td标签

    [Java教程]jQuery获取table表中的td标签 0 2017-07-28 00:00:08 首先我来介绍一下我遇到的问题 1.当有一个table表包含了 标签,标签,大致可以认为是这样的: ...

  10. java 普通类request_[Java教程]spring在普通类中获取session和request

    [Java教程]spring在普通类中获取session和request 0 2014-08-12 08:01:13 在使用spring时,经常需要在普通类中获取session,request等对像. ...

最新文章

  1. windows中使用git和开源中国
  2. 判断图有无环_链表:环找到了,那入口呢?
  3. hdu5348 MZL's endless loop(欧拉回路)
  4. MySQL从服务器写入报错吗_MySQL主从复制读写分离及奇怪的问题
  5. Java如何控制用户输入的长度,用Java Applet 进行Web编程时,如何限制输入域中可输入字符的长度!解决后马上给分!!!...
  6. IIS内部错误:500之解决方案
  7. 【LeetCode】【HOT】617. 合并二叉树(递归)
  8. 总结一下linux中的分段机制
  9. 超级压缩,将3D压缩成一种图片
  10. android状态栏右上角增加图标的方法
  11. css flex所有属性总结
  12. 为什么CPU需要时钟才能工作
  13. 怎么还原计算机字体库,如何在XP系统中恢复字库文件?WinXp系统恢复字库文件图文教程...
  14. 安装VS2010的SP1补丁的办法
  15. 如何通过轨迹信息判断驾驶人是否为同一人?
  16. 电脑桌面里的计算机里的软件是啥,屏幕尺子有哪些?电脑屏幕尺子软件推荐
  17. 2022怎么样做好网站的SEO优化?
  18. mysql aes encrypt_MySQL如何正确地利用AES_ENCRYPT()与AES_DECRYPT()加解密
  19. 【阅读笔记】机器阅读理解(中)——架构篇
  20. UGUI学习笔记(十二)自制血条控件

热门文章

  1. Maven依赖中scope的含义
  2. Git----远程仓库之添加远程库02
  3. 解析json结构绘制canvas
  4. linux(ubuntu) 搭建java程序运行环境
  5. OC 和 swift 小结
  6. postman本地访问https
  7. 随着浏览器窗口缩小表格出现横向滚动条
  8. 创建一个MDK工程模板
  9. Storm 多语言支持
  10. 11 个创新的网站滑动效果设计案例展示