
| 
 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://www.cnblogs.com/zxf330301/p/5366408.html