首先要明白,Recycle机制并不是Java中的垃圾回收机制,而是相当于一种设计模式
思想:当一个对象不再使用时,储存起来,而不是让虚拟机回收,需要的时候再用,避免对象被回收之后重分配
适用范围:对于应用的生命周期内或者某一个循环内需要频繁的创建对象
不足:需要手动为废弃对象调用Recycle()方法
实现方式:
- 要一个仓库来存放暂时不用的对象
- 需要新对象的时候不去new,而是obtain(去仓库中取对象)
- Recycle(回收不再使用的对象)
简单实现:
/**
* Created by Tiou on 2014/7/15.
* 一个实现 Recycle 机制的对象
*/
public class Data { /**
* 对象池,就是上文所提到的对象仓库,用于暂时存放不用的对象。
* 用链表来实现对象池结构,直观,高效,易用。
* sPool 便是指向链表头部的引用
*/
private static Data sPool; /**
* 同步锁
*/
private static final Object sPoolSync = new Object(); /**
* 当前池中的对象数量
*/
private static int sPoolSize = 0; /**
* 对象池的最大容量
*/
private static final int MAX_POOL_SIZE = 50; /**
* 指向链表中的下一个元素,当 next 为 null 时表示已到达链表末端
*/
private Data next; /**
* 隐藏构造函数,避免对象被 new 关键字创建
*/
private Data(){} /**
* 从池里获取一个新对象,没有的话则返回一个新的实例
* @return 可用的新对象
*/
public static Data obtain(){
synchronized (sPoolSync) {
if (sPool != null) { // 池中有可用的对象
// 对于对象池来说顺序并没有关系
// 这里取链表的第一个对象,主要是因为方便
Data data = sPool;
sPool = sPool.next;
data.next = null;
sPoolSize--;
return data;
}
}
return new Data();
} /**
* 将当前对象回收,一旦对象被回收,便不能再使用,代码中也不应存有任何到该对象的引用
*/
public void recycle(){
clear(); //清理对象
synchronized (sPoolSync){
//当对象池满后,回收的对象将直接交给 GC 回收
if(sPoolSize < MAX_POOL_SIZE) {
// 把当前对象作为首元素按入链表中
next = sPool;
sPool = this;
sPoolSize++;
}
}
} /**
* 重置对象到刚初始化时的状态
*/
private void clear(){ }
}
注意:
- 对象池的容量不能无限大,具体大小可以灵活设置
- Obtain和Recycle都不是原子操作,所以在多线程时会产生问题,因此这两个方法要加锁,保证线程安全
Android中的具体实现:
参考:http://www.jianshu.com/p/5cba251c7fd9