commons-pool2源码走读(三) 对象池BaseGenericObjectPool<T>
BaseGenericObjectPool<T>为GenericObjectPool和GenericKeyedObjectPool提供通用功能的基类。这个类存在的主要原因是减少两个池实现之间的代码复制。
1. 属性加载
BaseGenericObjectPool<T> 定义了所有能够自定义的属性,在类进行初始化的时候设置属性的默认值为BaseObjectPoolConfig和GenericKeyedObjectPoolConfig的默认值。然后子类通过继承其set方法重新覆盖(或延用)默认值。
其属性定义如下,可以看到所有的属性都是volatile的私有变量(fairness除外,在初始化指定后不再变化)。因为属性的变化不依赖之前的值,相较于使用锁而言使用volatile更加快捷高效。
// 最大连接数,默认-1,当值为负数,使用Integer.MAX_VALUE代替
private volatile int maxTotal =
GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL;
//当活跃对象总数达到上限,继续调用borrowObject是是否阻塞,默认true阻塞
private volatile boolean blockWhenExhausted =
BaseObjectPoolConfig.DEFAULT_BLOCK_WHEN_EXHAUSTED;
//等待连接的超时时间,当blockWhenExhausted =ture,超过该值还未获得对象抛出异常。
private volatile long maxWaitMillis =
BaseObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS;
//是否使用先进先出策略,默认true
private volatile boolean lifo = BaseObjectPoolConfig.DEFAULT_LIFO;
//是否使用平锁,默认false
private final boolean fairness;
//在创建对象的时候测试该对象,默认false
private volatile boolean testOnCreate =
BaseObjectPoolConfig.DEFAULT_TEST_ON_CREATE;
//在借用对象的时候测试该对象,默认false
private volatile boolean testOnBorrow =
BaseObjectPoolConfig.DEFAULT_TEST_ON_BORROW;
//在归还对象的时候测试该对象,默认false
private volatile boolean testOnReturn =
BaseObjectPoolConfig.DEFAULT_TEST_ON_RETURN;
//在对象空闲的时候测试该对象,默认false
private volatile boolean testWhileIdle =
BaseObjectPoolConfig.DEFAULT_TEST_WHILE_IDLE;
//回收线程的执行周期,即多长时候执行一次空闲对象检测。单位是毫秒数。
//如果小于等于0,则不执行检测线程。默认值是-1;
private volatile long timeBetweenEvictionRunsMillis =
BaseObjectPoolConfig.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
//回收线程每次回收时检测的空闲对象个数,即可能不是每个空闲对象都会进行检测是否能够被回收
//当值>=0时,取该数与空闲对象总数的较小值。<0时:空闲总数/该值绝对值,并向上取整。默认3
private volatile int numTestsPerEvictionRun =
BaseObjectPoolConfig.DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
//空闲对象被回收的最小空闲时间,默认30分钟,空闲时间超过30分钟的对象将被回收线程强制回收,
//不会保留最小的空闲对象数量
<