【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
源代码下载
官网
Git 下载:
$ git clone https://git-wip-us.apache.org/repos/asf/commons-pool.git
源码包下载src.zip
核心的类及关系如下图:
ObjectPool
ObjectPool是对象池的接口,定义了非常简单的接口,仅仅需要通过addObject添加对象borrowObject可以获取对象,returnObject归还对象,invalidateObject让对象失效。 实例如下:
public class ObjectPoolTest {
public static void main(String[] args) throws Exception {
ObjectPool pool = new GenericObjectPool();
PoolableObjectFactory factory = new PoolableObjectFactory() {
@Override
public Object makeObject() throws Exception {
return new Object();
}
@Override
public void destroyObject(Object obj) throws Exception {
}
@Override
public boolean validateObject(Object obj) {
return false;
}
@Override
public void activateObject(Object obj) throws Exception {
}
@Override
public void passivateObject(Object obj) throws Exception {
}
};
pool.setFactory(factory);
pool.addObject();
Object obj = null;
try {
obj = pool.borrowObject();
//...use the object...
} catch(Exception e) {
// invalidate the object
pool.invalidateObject(obj);
// do not return the object to the pool twice
obj = null;
} finally {
// make sure the object is returned to the pool
if(null != obj) {
pool.returnObject(obj);
}
}
}
}
对象池的一般操作
上面的实例大致可以看到对象池的使用方法,就是初始化池、往池中放入对象、从池中取对象、归还对象和销毁对象几个操作。下面就通用的GenericObjectPool为例分析一下相关的操作
GenericObjectPool相关数据结构
Config
Config是GenericObjectPool的简单内部类,其打包了GenericObjectPool的基本配置,详细说明及默认值可以参见源码。
Latch
Latch用来控制对象到线程的分配顺序,以确保公平性。也就是说,对象按线程请求对象的顺序分配给线程。
构造与初始化
GenericObjectPool将对象的make过程委托给PoolableObjectFactory工厂去做了,其所有构造方法中都有PoolableObjectFactory这个接口,也就是说如果想要实例化GenericObjectPool需要传入PoolableObjectFactory的实现
addObject()方法
如上所述,addObject()方法如果在PoolableObjectFactory的实现为空时会抛出异常:
if (_factory == null) {
throw new IllegalStateException("Cannot add objects without a factory.");
}
addObject()方法会调用PoolableObjectFactory实现类的makeObject()方法,并调用addObjectToPool()方法将对象放入对象池。
borrowObject()方法
当池中有了对象之后,就可以取到了,如果没有会抛出异常
returnObject()方法
将对象放回池中
invalidateObject()方法
将对象destroy
来源:oschina
链接:https://my.oschina.net/u/3729778/blog/2120275