
| ReferenceQueue queue = new ReferenceQueue (); PhantomReference pr = new PhantomReference (object, queue); | 

| MyObject aRef = new  MyObject(); SoftReference aSoftRef=new SoftReference(aRef); | 
| aRef = null; | 
| MyObject anotherRef=(MyObject)aSoftRef.get(); | 
| ReferenceQueue queue = new  ReferenceQueue(); SoftReference  ref=new  SoftReference(aMyObject, queue); | 
| SoftReference ref = null; while ((ref = (EmployeeRef) q.poll()) != null) {     // 清除ref } | 
| 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"     } …… | 
| 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);        }     } | 
原文:http://blog.csdn.net/u012235132/article/details/44264349