下面代码摘自《Android高性能编程》,注解是加上去的
public abstract class ObjectPool<T> {
private SparseArray<T> freePool;//空闲对象集合
private SparseArray<T> lentPool;//非空闲对象集合
private int maxCapacity;//最大创建对象数
/**
* 构造方法一
* @param initialCapacity 预分配的对象数
* @param maxCapacity 最大创建对象数
*/
public ObjectPool(int initialCapacity, int maxCapacity){
initialize(initialCapacity);//初始化方法
this.maxCapacity = maxCapacity;
}
/**
* 构造方法二
* @param maxCapacity 最大创建对象数
*/
public ObjectPool(int maxCapacity){
this(maxCapacity/2, maxCapacity);//调用构造方法一,设置预分配对象数为最大对象数的一半
}
/**
* 初始化方法
* @param initialCapacity
*/
private void initialize(final int initialCapacity){
lentPool = new SparseArray<>();
freePool = new SparseArray<>();
//创建预分配对象并加入空闲对象集合
for (int i=0; i < initialCapacity; i++){
freePool.put(i, create());
}
}
protected abstract T create();//创建对象的方法
//对象回收前调用
protected void restore(T t){
}
/**
* 获取可用对象
* @return 可用对象
*/
public T acquire(){
T t = null;
synchronized (freePool){//线程锁,保证线程安全
int freeSize = freePool.size();
//在空闲集合中寻找可用对象
for (int i = 0; i < freeSize; i++){
int key = freePool.keyAt(i);
t = freePool.get(key);
if (t != null){//找到后,将可用对象放入非空闲集合,移出空闲集合,并返回该对象
this.lentPool.put(key, t);
this.freePool.remove(key);
return t;
}
}
//空闲集合中没有可用对象,判断对象是否达到最大数量
if (lentPool.size() + freeSize < maxCapacity){
//未达到最大数量则创建新的对象赋给t, 并将其加入非空闲集合
t = create();
lentPool.put(lentPool.size()+freeSize, t);
}
}
return t;//如果达到最大数,这里返回的是null
}
/**
* 回收对象
* @param t 要回收的对象
*/
public void release(T t){
if (t == null){
return;
}
int key = lentPool.indexOfValue(t);//找到key
restore(t);//回收前处理
//移动到空闲集合
this.freePool.put(key, t);
this.lentPool.remove(key);
}
}