$ git clone https://git-wip-us.apache.org/repos/asf/commons-pool.git
核心的類及關係以下圖: html
ObjectPool是對象池的接口,定義了很是簡單的接口,僅僅須要經過addObject添加對象borrowObject能夠獲取對象,returnObject歸還對象,invalidateObject讓對象失效。 實例以下:git
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爲例分析一下相關的操做apache
Config是GenericObjectPool的簡單內部類,其打包了GenericObjectPool的基本配置,詳細說明及默認值能夠參見源碼。數據結構
Latch用來控制對象到線程的分配順序,以確保公平性。也就是說,對象按線程請求對象的順序分配給線程。ide
GenericObjectPool將對象的make過程委託給PoolableObjectFactory工廠去作了,其全部構造方法中都有PoolableObjectFactory這個接口,也就是說若是想要實例化GenericObjectPool須要傳入PoolableObjectFactory的實現線程
如上所述,addObject()方法若是在PoolableObjectFactory的實現爲空時會拋出異常:code
if (_factory == null) { throw new IllegalStateException("Cannot add objects without a factory."); }
addObject()方法會調用PoolableObjectFactory實現類的makeObject()方法,並調用addObjectToPool()方法將對象放入對象池。htm
當池中有了對象以後,就能夠取到了,若是沒有會拋出異常對象
將對象放回池中blog
將對象destroy