struts源代碼閱讀(Commons-Pool包)

作者:藍色憂鬱

email:[email protected]

版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
原文地址:
http://www.matrix.org.cn/resource/article/43/43760_Struts.html
關鍵字:Struts;Commons Pool

一、 XXXObjectPoolFactory
這些類用來生成相應的XXXObjectPool,比如GenericKeyedObjectPoolFactory:這個類用來生成一個新的GenericKeyedObjectPool對象。它實際的作用只是保存創建一個GenericKeyedObjectPool對象所需要的配置參數。如果使用默認的配置參數生成一個GenericKeyedObjectPool對象,那麼可以調用GenericKeyedObjectPoolFactory(KeyedPoolableObjectFactory factory, GenericKeyedObjectPool.Config config),其中Config類裏保存所有的缺省配置參數。

二、GenericKeyedObjectPool
通過_poolMap來管理相應的對象鏈,key作爲尋找不同對象鏈的線索。也就是說,一個GenericKeyedObjectPool中可以管理多個不同key的對象集合,每個集合通過_activeMap用來保存各個不同的Key當前的活動對象的數量(閒置對象的數量可以直接通過相應的CursorableLinkedList的size來獲取),可以通過getNumActive(Object key)和getNumIdle(Object key)方法獲取這
兩個值。這個對象集合通過CursorableLinkedList來管理。

這個類裏的_maxIdle和_maxActive屬性是針對單個key對應的CursorableLinkedList而言的最大值,而_maxTotal屬性則是對所有的key表示的對象集合的總和的最大值。_totalActive+_totalIdle用來和_maxTotal的值進行對比,它們可以通過getNumActive()和getNumIdle()獲取。_poolList存放的值與 _poolMap 中的key值一樣,注意這個對象不是沒有用處的,因爲CursorableLinkedList是一個允許多個線程同步迭代的類。

1、幾個內置的static類型的變量:
WHEN_EXHAUSTED_FAIL 這個屬性表明當對象池已經用盡時(比如說池中的對象數目已經達到了最大值),borrowObject方法應該立刻拋出NoSuchElementException異常。

WHEN_EXHAUSTED_BLOCK 這個屬性表明當對象池已經用盡時(比如說池中的對象數目已經達到了最大值),borrowObject方法應該等待,直到對象池中有一個對象可以讓它返回,或者達到了最大等待時間(DEFAULT_MAX_WAIT)。

WHEN_EXHAUSTED_GROW 這個屬性表明即使在對象池已經用盡時(比如說池中的對象數目已經達到了最大值),borrowObject方法應該仍舊返回一個對象。
DEFAULT_WHEN_EXHAUSTED_ACTION 這個屬性表明當對象池用盡的時候(比如說池中的對象數目已經達到了最大值)應該採取上面的那種策略。

DEFAULT_MAX_IDLE 和 DEFAULT_MAX_ACTIVE分別指定了在池中對大的空閒和活動對象的數目。DEFAULT_MAX_TOTAL表明對象池允許存在的最大對象數量。

2、CursorableLinkedList
它實際是一個雙向列表,與LinkedList的區別是:它允許多個線程執行迭代。它的實現思路是:在每次生成一個Cursor時:CursorableLinkedList.Cursor cursor(int i),都會吧這個新生成的Cursor對象包裝到一個 WeakReference 中:_cursors.add( new WeakReference(cur) );在不需要的的時候需要調用Cursor. close()方法取消註冊。而Cursor實際是一個以內嵌類的方式的實現了ListIterator接口的類。WeakReference 不會增加被其包裝的類的引用次數,換句話說,它不會影響JVM的垃圾收集。

3、borrowObject(Object key)
這個方法用來從相應的key表示的對象集合中取出一個對象。如果對應的對象集合不存在,會創建一個這樣的集合。如果集合當前沒有閒置的對象可以返回,並且當前的active < _maxActive && totalActive + _totalIdle < _maxTotal,那麼通過KeyedPoolableObjectFactory創建一個新的對象;否則就根據_whenExhaustedAction的設定執行相應的操作。要注意每次都會執行_factory.activateObject(key,pair.value)方法初始化這個對象。在返回這個對象之前,如果設定了_testOnBorrow標誌則調用_factory.validateObject(Object key, Object obj)方法,如果不符合要求會拋出NoSuchElementException異常,否則返回這個對象。

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實例的相應方法來操作。 用戶需要自己實現這個接口。  
發佈了4 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章