commons-pool2源码走读(一) 池对象PooledObject<T>接口及其实现

commons-pool2源码走读(一) PooledObject&amp;amp;amp;lt;T&amp;amp;amp;gt;接口PooledObject&amp;amp;amp;lt;T&amp;amp;amp;gt;用来定义池对象的一个wrapper 接口,用于跟踪对象的附加信息,比如状态、创建时间、使用时间等。这个类的实现必须是线程安全的。1. 接口定义PooledObject&amp;amp;amp;lt;T&amp;amp;am
摘要由CSDN通过智能技术生成

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
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值