快速业务通道

Java中对象的强、软、弱和虚引用 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
; SoftReference ref=new SoftReference(aMyObject, queue);

那么当这个SoftReference所软引用的aMyOhject被垃圾收集器 回收的同时,ref所强引用的SoftReference对象被列入 ReferenceQueue。也就是说,ReferenceQueue中保存的对象是 Reference对象,而且是已经失去了它所软引用的对象的Reference 对象。另外从ReferenceQueue这个名字也可以看出,它是一个队列 ,当我们调用它的poll()方法的时候,如果这个队列中不是空队列 ,那么将返回队列前面的那个Reference对象。

在任何时候,我们都可以调用ReferenceQueue的poll()方法来 检查是否有它所关心的非强可及对象被回收。如果队列为空,将返 回一个null,否则该方法返回队列中前面的一个Reference对象。利 用这个方法,我们可以检查哪个SoftReference所软引用的对象已 经被回收。于是我们可以把这些失去所软引用的对象的 SoftReference对象清除掉。常用的方式为:

SoftReference ref = null; while ((ref = (EmployeeRef) q.poll()) != null) {    // 清除ref }

理解了ReferenceQueue的工作机制之后,我们就可以开始构造 一个Java对象的高速缓存器了。

Java中对象的强、软、弱和虚引用(3)

时间:2011-03-24 zhangjunhd

3.4通过软可及对象重获方法实现Java对象的高速缓存

利用Java2平台垃圾收集机制的特性以及前述的垃圾对象重获方 法,我们通过一个雇员信息查询系统的小例子来说明如何构建一种 高速缓存器来避免重复构建同一个对象带来的性能损失。我们将一 个雇员的档案信息定义为一个Employee类:

public class Employee {    private String id;// 雇员的标识号码    private String name;// 雇员姓名    private String department;// 该雇员所在部门    private String Phone;// 该雇员联系电话    private int salary;// 该雇员薪资    private String origin;// 该雇员信息的来源    // 构造方法    public Employee(String id) {     this.id = id;     getDataFromlnfoCenter();    }    // 到数据库中取得雇员信息    private void getDataFromlnfoCenter() {     // 和数据库建立连接井查询该雇员的信息,将查询结果 赋值     // 给name,department,plone,salary等变量     // 同时将origin赋值为"From DataBase"    } ……

这个Employee类的构造方法中我们可以预见,如果每次需要查 询一个雇员的信息。哪怕是几秒中之前刚刚查询过的,都要重新构 建一个实例,这是需要消耗很多时间的。下面是一个对Employee对 象进行缓存的缓存器的定义:

import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.util.Hashtable; public class EmployeeCache {    static private EmployeeCache cache;// 一个Cache实例    private Hashtable<String,EmployeeRef> employeeRefs;// 用于Chche内容的存储    private ReferenceQueue<Employee> q;// 垃圾 Reference的队列    // 继承SoftReference,使得每一个实例都具有可识别的 标识。    // 并且该标识与其在HashMap内的key相同。    private class EmployeeRef extends SoftReference<Employee> {     private String _key = "";     public EmployeeRef(Employee em, ReferenceQueue<Employee> q) {       super(em, q);       _key = em.getID();     }    }    // 构建一个缓存器实例    private EmployeeCache() {     employeeRefs = new Hashtable<String,EmployeeRef>();     q = new ReferenceQueue<Employee&

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号