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);
}
}
posted @ 2018-08-15 15:55  lightverse  阅读(291)  评论(0编辑  收藏  举报