commons-pool2源码走读(一) 池对象PooledObject<T>接口及其实现
PooledObject<T>用来定义池对象的一个wrapper 接口,用于跟踪对象的附加信息,比如状态、创建时间、使用时间等。这个类的实现必须是线程安全的。
1. 接口定义
PooledObject<T>继承自Comparable<PooledObject<T>>,表明池对象是可以排序的。该接口定义了大量的方法用来获取一个池对象的诸多信息。
该接口源代码如下
public interface PooledObject<T> extends Comparable<PooledObject<T>> {
//返回被包装的实际对象
T getObject();
//返回该对象的创建时间
long getCreateTime();
//以毫秒为单位获得该对象最后在活动状态中使用的时间(它可能仍然处于活动状态,在这种情况下后续调用将返回一个增加的值)。
long getActiveTimeMillis();
//以毫秒为单位获得该对象最后在空闲状态中花费的时间(它可能仍然处于空闲状态,在这种情况下,后续调用将返回一个增加的值)。
long getIdleTimeMillis();
//上次借用时间
long getLastBorrowTime();
//上次归还时间
long getLastReturnTime();
/**
* 返回上次使用时间的一个估计值,如果Pooled Object实现了TrackedUse接口
* 那么返回值将是TrackedUse.getLastUsed()和getLastBorrowTime()的较大者,
* 否则返回值和getLastBorrowTime()相等
*/
long getLastUsedTime();
@Override
int compareTo(PooledObject<T> other);
@Override
boolean equals(Object obj);
@Override
int hashCode();
@Override
String toString();
//尝试将池对象置于PooledObjectState.EVICTION状态
boolean startEvictionTest();
boolean endEvictionTest(Deque<PooledObject<T>> idleQueue);
//分配该对象,如果源状态为PooledObjectState.IDLE空闲状态则返回true,
//同时将状态改为PooledObjectState.ALLOCATED,该状态表明对象正在被使用
boolean allocate();
//与上面一个方法作用相反,将PooledObjectState.ALLOCATED置为PooledObjectState.IDLE
boolean deallocate();
//将对象置为PooledObjectState.INVALID无效状态
void invalidate();
//设置是否记录对象使用的堆栈信息,可用于池泄漏时问题追溯
void setLogAbandoned(boolean logAbandoned);
void use();
//打印对象的调用堆栈信息
void printStackTrace(PrintWriter writer);
//返回对象目前的状态
PooledObjectState getState();
//标记该对象发生了泄漏
void markAbandoned();
//标记该对象正在被归还到对象池
void markReturning();
}
2.状态枚举PooledObjectState
在上面的接口中,大多数的方法都用来更改对象的状态,根据对象的状态可以推断出该对象是否正在使用,以及接下来可以进行什么样的操作。对象状态如下:
public enum PooledObjectState {
/**
* 在队列中,未被使用,空闲状态。调用allocate()方法后对象应该被置于该状态
*/
IDLE,
/**
* 已分配,在使用中,调用all