中山网站设计收费标准,手机网站懒人模板,sql如何建设网站数据库,孟村住房建设局网站十分钟理解Java中的弱引用#xff0c;十分钟java引用本篇文章尝试从What、Why、How这三个角度来探索Java中的弱引用#xff0c;帮助大家理解Java中弱引用的定义、基本使用场景和使用方法。由于个人水平有限#xff0c;叙述中难免存在不准确或是不清晰的地方#xff0c;希望…十分钟理解Java中的弱引用十分钟java引用本篇文章尝试从What、Why、How这三个角度来探索Java中的弱引用帮助大家理解Java中弱引用的定义、基本使用场景和使用方法。由于个人水平有限叙述中难免存在不准确或是不清晰的地方希望大家可以指出谢谢大家)1. What——什么是弱引用Java中的弱引用具体指的是java.lang.ref.WeakReference类我们首先来看一下官方文档对它做的说明弱引用对象的存在不会阻止它所指向的对象被垃圾回收器回收。弱引用最常见的用途是实现规范映射(canonicalizing mappings比如哈希表)。假设垃圾收集器在某个时间点决定一个对象是弱可达的(weakly reachable)(也就是说当前指向它的全都是弱引用)这时垃圾收集器会清除所有指向该对象的弱引用然后把这个弱可达对象标记为可终结(finalizable)的这样它随后就会被回收。与此同时或稍后垃圾收集器会把那些刚清除的弱引用放入创建弱引用对象时所指定的引用队列(Reference Queue)中。实际上Java中存在四种引用它们由强到弱依次是强引用、软引用、弱引用、虚引用。下面我们简单介绍下除弱引用外的其他三种引用强引用(Strong Reference)通常我们通过new来创建一个新对象时返回的引用就是一个强引用若一个对象通过一系列强引用可到达它就是强可达的(strongly reachable)那么它就不被回收软引用(Soft Reference)软引用和弱引用的区别在于若一个对象是弱引用可达无论当前内存是否充足它都会被回收而软引用可达的对象在内存不充足时才会被回收因此软引用要比弱引用“强”一些虚引用(Phantom Reference)虚引用是Java中最弱的引用那么它弱到什么程度呢它是如此脆弱以至于我们通过虚引用甚至无法获取到被引用的对象虚引用存在的唯一作用就是当它指向的对象被回收后虚引用本身会被加入到引用队列中用作记录它指向的对象已被回收。Why——为什么使用弱引用考虑下面的场景现在有一个Product类代表一种产品这个类被设计为不可扩展的而此时我们想要为每个产品增加一个编号。一种解决方案是使用HashMap。于是问题来了如果我们已经不再需要一个Product对象存在于内存中(比如已经卖出了这件产品)假设指向它的引用为productA我们这时会给productA赋值为null然而这时productA过去指向的Product对象并不会被回收因为它显然还被HashMap引用着。所以这种情况下我们想要真正的回收一个Product对象仅仅把它的强引用赋值为null是不够的还要把相应的条目从HashMap中移除。显然“从HashMap中移除不再需要的条目”这个工作我们不想自己完成我们希望告诉垃圾收集器在只有HashMap中的key在引用着Product对象的情况下就可以回收相应Product对象了。显然根据前面弱引用的定义使用弱引用能帮助我们达成这个目的。我们只需要用一个指向Product对象的弱引用对象来作为HashMap中的key就可以了。How——如何使用弱引用拿上面介绍的场景举例我们使用一个指向Product对象的弱引用对象来作为HashMap的key只需这样定义这个弱引用对象Product productA new Product(...);WeakReference 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类型的参数通过提供这个参数我们便把创建的弱引用对象注册到了一个引用队列上这样当它被垃圾回收器清除时就会把它送入这个引用队列中我们便可以对这些被清除的弱引用对象进行统一管理。参考资料WeakReference (Java Platform SE 7 ) – Oracle Help Center理解Java中的弱引用