Pool, SimplePool与SynchronizedPool

来源:互联网 发布:linux应用放到哪里 编辑:程序博客网 时间:2024/06/18 14:18

转载自:http://androidigging.blog.51cto.com/2753843/1426766

因为硬件资源的限制,Android在很多地方都使用了Pool的,特别是对于需要通过native的方式调用资源,比如专门用于获取Touch、Flinging以及其他手势速度的VelocityTracker类,文档中指明了调用方式必须是:

    // 创建    VelocityTracker mVelocityTracker = VelocityTracker.obtain();    // 回收    mVelocityTracker.recycle();    mVelocityTracker = null;

其内部使用了SynchronizedPool来实现:

    public final class VelocityTracker {        private static final SynchronizedPool<VelocityTracker> sPool =            new SynchronizedPool<VelocityTracker>(2);        //省略其他代码    }

其实现包括三个类和接口:Pool接口, SimplePool类与SynchronizedPool类,其实现代码在android.util.Pools类中。代码结构如下:

Pool接口

    public static interface Pool<T> {        public T acquire();        public boolean release(T instance);    }    //定义了两个方法,一个从Pool中获取,另一个将对象释放到Pool中,非常简洁。

SimplePool类

    public static class SimplePool<T> implements Pool<T> {        private final Object[] mPool;        private int mPoolSize;    public SimplePool(int maxPoolSize) {        if (maxPoolSize <= 0) {            throw new IllegalArgumentException("The max pool size must be > 0");        }        mPool = new Object[maxPoolSize];        }    }

使用一个Object数组来存放,因此Pool的容量是固定的,因此这里用Object数组是最简单的,如果需要实现可以自动扩展的Pool,大可以将Object数组替换成链表。

SynchronizedPool类

    public static class SynchronizedPool<T> extends SimplePool<T> {    private final Object mLock = new Object();    // ...    public T acquire() {        synchronized (mLock) {            return super.acquire();        }    }    public boolean release(T element) {        synchronized (mLock) {            return super.release(element);        }    }    }

这里只是增加了一个锁(mLock),在Java里面任何一个对象都可以当作锁。至于为什么直接用synchronized(this),一般认为synchronized(this)这样是不好的,举个例子,如果外面的代码使用了synchronized(mSynchronizedPool)就会出现问题了,甚至有可能死锁。可以参考:Avoid synchronized(this) in Java?

如何使用

如何使用这几个类呢,方法如下:

    public class MyPooledClass {      private static final SynchronizedPool sPool = new SynchronizedPool(10);       public static MyPooledClass obtain() {       MyPooledClass instance = sPool.acquire();       return (instance != null) ? instance : new MyPooledClass();       }       public void recycle() {        // Clear state if needed.        sPool.release(this);       }       // ...    }

非常简洁,看来实现一个Pool也是一件很容易的事情。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 拼多多付款后商品下架了怎么办 淘宝上买化妆品买到假货了怎么办 找苹果官网解id发票丢了怎么办 客人已交订金但要取消宴席怎么办 京东买的小米电视碎屏了怎么办 京东购买的电视碎屏了怎么办 淘宝上买手机不能用不给退怎么办 天猫申请退货退款卖家不处理怎么办 在淘宝买到货到付款的假苹果怎么办 跟朋友买手机买到假货怎么办 在淘宝网上买到不合格的产品怎么办 淘宝打假师打了我的店铺怎么办 收藏品公司关门跑路员工怎么办 客户快递签收后说货物短缺怎么办 京东商城买东西商家不换货怎么办 在商场买东西过几天就降价了怎么办 天猫买东西不退货不退款怎么办 买买8p美版的怎么办 京东金条银行卡被冻结还不了怎么办 在瑞士刚买的浪琴手表不走了怎么办 刚买的手表表镜有划痕 怎么办 唯品会上买的手表有质量问题怎么办 我买的对方材料没开票给我怎么办 给对方修完车车主不给发票怎么办 买苹果手机花呗额度不够怎么办 苹果手机用别人的手机卡激活怎么办 小米商城花呗分期额度不够怎么办 淘宝已经形成订单商家不发货怎么办 小米商城退款后又想买了怎么办 淘宝退货退款后不想退了怎么办 在转转的商品被屏了怎么办 不懂如何挑选适合自己的衣服怎么办 淘宝购买商品给顾客造成损失怎么办 微信购物地址写错了怎么办 微信购物后一直不发货怎么办 微信购物不发货也不退款怎么办 淘宝退货不小心点了确认收货怎么办 外卖不小心点了确认收货怎么办 圆通快递单号查不到物流信息怎么办 在京东买东西没收到退回去了怎么办 我的东西没收到退回去了怎么办