Android根據Message 提取出來的對象池部分

public class RecyclableObject {    /**     * 對象池的大小 若是對象池滿 則不會再將東西加入進去     */    private static final int MAX_POOL_SIZE = 50;    /**     * 表明是否該對象已經在對象池裏     */    private static final int FLAG_IN_POOL = 1;    /**     * 同步鎖 若是多個線程同時調用Obtain方法,對其進行同步     */    private static final Object sPoolSync = new Object();    /**     * 對象池的起點     */    private static RecyclableObject sPool;    /**     * 對象池大小     */    private static int sPoolSize = 0;    /**     * 用於標誌是否在對象池裏     */    private int flags;    /**     * 當對象 在對象池裏 鏈接下一個對象池中的對象     * object -> object -> object     */    private RecyclableObject next;    /**     * 經過obtain獲取到的對象 有可能會複用對象池的對象 減小內存壓力     * @return 可循環用的對象     */    public static RecyclableObject obtain() {        synchronized (sPoolSync) {            if (sPool != null) {                RecyclableObject m = sPool;                sPool = m.next;                m.next = null;                m.flags = 0; // clear in-poll flag                sPoolSize--;                return m;            }        }        return new RecyclableObject();    }    /**     * 當對象再也不須要時,清理完裏面的數據,而後調用此方法,能將它釋放到對象池裏,注意     * 一旦recycle,外界儘可能不要有它的引用了     */    public void recycle() {        if (isInPool()) {            throw new IllegalStateException("This object cannot be recycled because it "                    + "is still in use.");        }        recycleUnchecked();    }    private void recycleUnchecked() {        // Mark the object as in use while it remains in the recycled object pool.        // Clear out all other details.        flags = FLAG_IN_POOL;        synchronized (sPoolSync) {            if (sPoolSize < MAX_POOL_SIZE) {                next = sPool;                sPool = this;                sPoolSize++;            }        }    }    /**     * 將已經recycle的對象設置爲in use,表明已經在對象池裏 防止對一個對象屢次recycle 而後出現循環鏈表     * @return     */    private boolean isInPool() {        return ((flags & FLAG_IN_POOL) == FLAG_IN_POOL);    }}
相關文章
相關標籤/搜索