java强软弱虚引用详解(转载)
转载自:http://zhangjunhd.blog.51cto.com/113473/53092/
2007-12-01 17:20:20
| 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);        }     }     // 清除Cache内的全部内容     public void clearCache() {        cleanCache();        employeeRefs.clear();        System.gc();        System.runFinalization();     } } | 
| public class SocketManager {     private Map<Socket, User> m = new HashMap<Socket, User>();     public void setUser(Socket s, User u) {        m.put(s, u);     }     public User getUser(Socket s) {        return m.get(s);     }     public void removeUser(Socket s) {        m.remove(s);     } } | 
| import java.util.WeakHashMap; class Element {     private String ident;     public Element(String id) {        ident = id;     }     public String toString() {        return ident;     }     public int hashCode() {        return ident.hashCode();     }     public boolean equals(Object obj) {        return obj instanceof Element && ident.equals(((Element) obj).ident);     }     protected void finalize(){        System.out.println("Finalizing "+getClass().getSimpleName()+" "+ident);     } } class Key extends Element{     public Key(String id){        super(id);     } } class Value extends Element{     public Value (String id){        super(id);     } } public class CanonicalMapping {     public static void main(String[] args){        int size=1000;        Key[] keys=new Key[size];        WeakHashMap<Key,Value> map=new WeakHashMap<Key,Value>();        for(int i=0;i<size;i++){            Key k=new Key(Integer.toString(i));            Value v=new Value(Integer.toString(i));            if(i%3==0)               keys[i]=k;            map.put(k, v);        }        System.gc();     } } | 
| public class SocketManager {     private Map<Socket,User> m = new WeakHashMap<Socket,User>();     public void setUser(Socket s, User u) {         m.put(s, u);     }     public User getUser(Socket s) {         return m.get(s);     } } | 
本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/53092
java强软弱虚引用详解(转载)的更多相关文章
- ThreadLocal以及强软弱虚引用
		1.ThreadLocal ThreadLocal即线程本地,可以实现每个线程存入取出TreadLocal值互不影响.因为TheadLocal底层是用了一个Map结构存放数据,而这个Map是从当前这个 ... 
- Java对象的强、软、弱和虚引用详解
		1.对象的强.软.弱和虚引用 转自:http://zhangjunhd.blog.51cto.com/113473/53092/ 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ... 
- Java 强引用 软引用 弱引用 虚引用详解
		详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt393 众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方 ... 
- 5.9 j(java学习笔记)强软弱虚引用及WeakHashMap、IdentityHashMap、EnumMap
		一.引用分类 强:运行垃圾回收机制后也不回收,程序出现内存溢出也不回收. 软:在垃圾回收机制运行时判断内存是否已满,如果内存已满则回收,内存充足则不回收. 弱:垃圾回收机制运行后不论内存是否充足都会立 ... 
- eclipse中java项目的build path详解(转载)
		BuildPath中只支持加入jar文件,具体方法如下:在eclips里在工程名上右键->build path->contigure bud path->java build pat ... 
- JAVA不可不知的强软弱虚四种引用
		一个变量指向new对象,就是引用,在java中有四种引用,分别是强软弱虚,常见的Object o = new Object(),就是强引用,垃圾回收的时候,强引用不会被回收. 公用类: publi ... 
- 如约而至,Java 10 正式发布!   Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势  努力的孩子运气不会太差,跌宕的人生定当更加精彩  优先队列详解(转载)
		如约而至,Java 10 正式发布! 3 月 20 日,Oracle 宣布 Java 10 正式发布. 官方已提供下载:http://www.oracle.com/technetwork/java ... 
- java中的引用类型:强软弱虚
		java中的引用类型共4种:强软弱虚,具体每种类型的特点和应用场景.记录下.本文是看了马士兵老师的视频后记录整理的.加深印象. 基本概念 1. 强引用 强引用是使用最普遍的引用.如果一个对象具有强引用 ... 
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
		Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ... 
随机推荐
- virtualbox使用相关问题
			官方下载地址: http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html VirtualBox主 ... 
- Android动画之旅-Android动画基本介绍
			在上一篇博客中.我们简单了解了在Android中的动画特效.小伙伴们是不是意犹未尽呀. 还没有看的猛戳这里:Android动画之旅一开篇动画简单介绍 本篇博客.将和大家一起来分析Android中的四大 ... 
- Pthreads并行编程之spin lock与mutex性能对比分析(转)
			POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ... 
- Android版俄罗斯方块的实现
			学习Android的基本开发也有一段时间了,可是由于没有常常使用Android渐渐的也就忘记了. Android编程学的不深,不过为了对付逆向,可是有时还是会感到力不从心的.毕竟不是一个计算机专业毕业 ... 
- 【Datastage】函数大全
			一. 类型转换函数 类型转换函数用于更改参数的类型. 以下函数位于表达式编辑器的"类型转换"类别中.方括号表示参数是可选的.缺省日期格式为 %yyyy-%mm-%dd. 以下示例按 ... 
- Java的IO操作,个人理解。
			先看一段代码: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import ... 
- 基于easyui fom分组插件
			本插件适用于表单按属性分组,可以动态设置显示的列数,每一个表单宽度,表单类型,以及对齐.不同panel之间的表单也是对齐的. 效果: 依赖:jquery ,easyui, 实现过程:整个控件一个pan ... 
- Android之ImageButton控件基础操作
			控件绑定(前台对应控件的id属性要设置为imageButton_light) private ImageButton imageButton_light;//定义一个ImageButton控件对象,名 ... 
- C#代码覆盖率 -vsinstr和OpenCover
			最近接触的项目涉及到C#开发的应用,测试过程中我们需要去分析C#的代码覆盖率,问了一些人,在网上也搜了一些,零碎的找到很多资料,但是都不是很完整,实际使用的过程中还是走了不少弯路.到现在为止,有两种可 ... 
- JavaScript正则表达式基础知识汇总
			一.创建正则对象: 1.构造函数RegExp创建正则对象 var pattern = new RegExp('s$'); //pattern匹配以s结尾的字符串 2.使用正则直接量 var patte ... 
