对象池

下面代码摘自《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);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值