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>();
}
// 取得缓存器实例
public static EmployeeCache getInstance() {
if ( cache == null ) {
cache = new EmployeeCache();
}
return cache ;
}
// 以软引用的方式对一个 Employee 对象的实例进行引用并保存该引用
private void cacheEmployee(Employee em) {
cleanCache(); // 清除垃圾引用
EmployeeRef ref = new EmployeeRef(em, q );
employeeRefs .put(em.getID(), ref);
}
// 依据所指定的 ID 号,重新获取相应 Employee 对象的实例
public Employee getEmployee(String ID) {
Employee em = null ;
// 缓存中是否有该 Employee 实例的软引用,如果有,从软引用中取得。
if ( employeeRefs .containsKey(ID)) {
EmployeeRef ref = (EmployeeRef) employeeRefs .get(ID);
em = (Employee) ref.get();
}
// 如果没有软引用,或者从软引用中得到的实例是 null ,重新构建一个实例,
// 并保存对这个新建实例的软引用
if (em == null ) {
em = new Employee(ID);
System. out .println( "Retrieve From EmployeeInfoCenter. ID=" + ID);
this .cacheEmployee(em);
}
return em;
}
// 清除那些所软引用的 Employee 对象已经被回收的 EmployeeRef 对象
private void cleanCache() {
EmployeeRef ref = null ;
while ((ref = (EmployeeRef) q .poll()) != null
) {
employeeRefs .remove(ref. _key );
}
}
相关推荐
Java中弱引用软引用虚引用及强引用的区别Java开发Java经验技巧共3页.pdf.zip
Java 7之基础 - 强引用、弱引用、软引用、虚引用1
前言从JavaSE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决
referenceInJava:Java强引用,软引用,弱引用以及虚引用测试项目
笔者自己的通俗总结,5分钟搞清楚java中强软弱虚引用的区别^_^
在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,...
3.2 如果使用软引用SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收 3.
很早Java API就添加了弱引用(WeakReference)和软引用(SoftReference),但并不是所有的程序员都熟悉这两个概念
java 弱引用代码以及分析,详细讲解弱引用与强引用在垃圾回收时产生的区别
主要介绍了Java中强引用,软引用,弱引用概念解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
1.强引用1.强引用 2.软引用(SoftReference) 3.弱引用(WeakReference) 4.虚引用(PhantomReference) 等等;
这段代码实现了一个简单的缓存系统Cache,其中使用了Java的强引用和垃圾回收机制。...这个简单的示例代码展示了如何使用Java强引用和垃圾回收来实现一个缓存系统的简单功能,方便了对数据的管理和处理。
主要介绍了JAVA 强引用的相关资料,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。
这是一个简单的demo,只是简单的介绍的说了下,强引用,软引用,弱引用,虚引用
想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种... 从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过
java有四种引用类型:强引用、软引用、弱引用、虚引用 四大引用设计作用 因为java的内存分配和内存回收,都是由JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,即可达性分析 设计目的: 可以让...
主要介绍了详解Java对象的强、软、弱和虚引用+ReferenceQueue的相关资料,需要的朋友可以参考下
强引用可以直接访问目标对象强引用所指向的对象在任何时候都不会被系统回收,虚拟机宁愿抛出OOM异常,也不会回收强引用所指向的对象强引用可能导致内存泄漏软引用一个对
本文介绍了弱引用是对一个对象的引用的持有者。...弱引用和弱集合是对堆进行管理的强大工具,使得应用程序可以使用更复杂的可及性方案,而不只是由普通(强)引用所提供的“要么全部要么没有”可及性。