一
這些類用來生成相應的XXXObjectPool
二
通過_poolMap來管理相應的對象鏈
兩個值
這個類裡的_maxIdle和_maxActive屬性是針對單個key對應的CursorableLinkedList而言的最大值
WHEN_EXHAUSTED_FAIL 這個屬性表明當對象池已經用盡時(比如說池中的對象數目已經達到了最大值)
WHEN_EXHAUSTED_BLOCK 這個屬性表明當對象池已經用盡時(比如說池中的對象數目已經達到了最大值)
WHEN_EXHAUSTED_GROW 這個屬性表明即使在對象池已經用盡時(比如說池中的對象數目已經達到了最大值)
DEFAULT_WHEN_EXHAUSTED_ACTION 這個屬性表明當對象池用盡的時候(比如說池中的對象數目已經達到了最大值)應該采取上面的那種策略
DEFAULT_MAX_IDLE 和 DEFAULT_MAX_ACTIVE分別指定了在池中對大的空閒和活動對象的數目
它實際是一個雙向列表
這個方法用來從相應的key表示的對象集合中取出一個對象
4、returnObject(Object key, Object obj)
這個方法用來把一個對象返回給key表示的對象集合,這個方法的執行過程與borrowObject(Object key)方法相似。它會根據_testOnReturn標志執行_factory.validateObject(Object key, Object obj)方法檢查返回的對象是否合格。要注意每次都會執行 _factory.passivateObject(key, obj)方法“消除”這個對象。
5、過期類的回收:
Evictor 為一個內嵌類,實現自Runnable接口。它每過_timeBetweenEvictionRunsMillis毫秒會調用一次evict()方法,在後台收集垃圾壽命超過_minEvictableIdleTimeMillis毫秒的對象。每當我們創建一個GenericKeyedObjectPool對象的時候,這個類會被自動創建,並且被啟動。evict() 方法很簡單,它首先創建一個_evictionKeyCursor = _poolList.cursor()對象,然後根據key遍歷每一個對象集合。
查找到過期的就會刪除。
三、SoftReferenceObjectPool
通過SoftReference進行對象的保存,這個SoftReference的好處是你不需要自己進行收集,它會在JVM的內存用盡時被自動回收。這種對象池的特色是:
a、可以保存任意多個對象,不會有容量已滿的情況發生。
b、在對象池已空的時候,調用它的borrowObject方法,會自動返回新創建的實例。
c、可以在初始化同時,在池內預先創建一定量的對象。
d、當內存不足的時候,池中的對象可以被Java虛擬機回收。
四、StackObjectPool 和 StackKeyedObjectPool
通過一個Stack對對象進行管理,要注意這個Stack是繼承自Vector對象的。因此雖然線程安全,但是效率較低。這種對象池的特色是:
a、可以為對象池指定一個初始的參考大小(當空間不夠時會自動增長)。
b、在對象池已空的時候,調用它的borrowObject方法,會自動返回新創建的實例。
c、可以為對象池指定一個可保存的對象數目的上限。達到這個上限之後,再向池裡送回的對象會被自動送去回收。
五、PoolableObjectFactory
Pool組件利用PoolableObjectFactory來照看被池化的對象。ObjectPool的實例在需要處理被池化的對象的產生、激活、掛起、校驗和銷毀工作時,就會調用跟它關聯在一起的PoolableObjectFactory實例的相應方法來操作。 用戶需要自己實現這個接口。
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28570.html