對象池中存放的都是一些創建特別耗資源的對象,每次使用都創建很耗資源,所以用對象池預先創建一些對象,需要時從池中取出對象,不需要時將對象放回池中,提高代碼效率。
Apache Commons Pool
池對象工廠:
PooledObjectFactory(2.0以前叫PoolableObjectFactory)
PooledObjectFactory必是線程安全的,同一個對象同一時間不會被重複使用。
實現這個接口需要重寫五個方法
makeObject:需要對象時使用
validateObject:可在activateObject後調用,確保對象可被還回對象池;可在passivateObject前調用,確保對象可被還回對象池
activateObject:取出對象時,需要activate
passivateObject:還回對象時,需要passivate
destroyObject:對象從對象池中廢棄時調用
KeyedPooledObjectFactory與PooledObjectFactory類似,只是多了key參數
KeyedPooledObjectFactory<K,V> vs PoolableObjectFactory<T>
對象池:
GenericObjectPool
可設置對象池特徵:LIFO(後進先出)方式、最大最小空閒數、有效性檢查。
GenericKeyedObjectPool
對應KeyedPooledObjectFactory
SoftReferenceObjectPool
使用ArrayList保存對象池裏的對象,對象池裏不保存對象本身,而是保存它們的軟引用
特點:可以保存任意多個對象,對象池不會滿;取出對象時,如果對象池已空,會創建新對象;內存不足時,池中對象可以回收。
對象池設計
http://ifeve.com/generic-concurrent-object-pool/