java對象池ObjectPool

commons-pool提供了一套很好用的對象池組件。使用也很簡單,不過對一些簡單的對象使用對象池就不必了。

ObjectPool定義了一個簡單的池化接口,有三個對應實現 
GenericObjectPool:實現了可配置的後進先出或先進先出(LIFO/FIFO)行爲,默認是做爲一個後進先出隊列,這意味當對象池中有可用的空閒對象時,borrowObject 將返回最近的對象實例,若是將lifo 屬性設置爲false,則按FIFO行爲返回對象實例。
StackObjectPool :實現了後進先出(LIFO)行爲。
SoftReferenceObjectPool: 實現了後進先出(LIFO)行爲。另外,對象池還在SoftReference 中保存了每一個對象引用,容許垃圾收集器針對內存須要回收對象。

KeyedObjectPool定義了一個以任意的key訪問對象的接口(能夠池化對種對象),有兩種對應實現。
GenericKeyedObjectPool :實現了先進先出(FIFO)行爲。
StackKeyedObjectPool : 實現了後進先出(LIFO)行爲。

PoolableObjectFactory 定義了池化對象的生命週期方法,咱們能夠使用它分離被池化的不一樣對象和管理對象的建立,持久,銷燬。
BasePoolableObjectFactory這個實現PoolableObjectFactory 接口的一個抽象類,咱們可用擴展它實現本身的池化工廠。

一個對象池使用的簡單例子:
package tf;

import org.apache.commons.pool.BasePoolableObjectFactory;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.StackObjectPool;

public class Pool {

	public static void main(String[] args) throws Exception {
		ObjectPool pool = new StackObjectPool(new UserFactory());
		User u = (User) pool.borrowObject(); // 從池中借出一個對象
		u.setName("me");
		u.sayHello();
		pool.returnObject(u); // 歸還對象
	}

	static class UserFactory extends BasePoolableObjectFactory {
		/**
		 * 產生一個新對象
		 */
		public Object makeObject() {
			return new User();
		}

		/**
		 * 還原對象狀態
		 */
		public void passivateObject(Object obj) {
			User u = (User) obj;
			u.clear();
		}
	}

	static class User {
		String name;

		void setName(String name) {
			this.name = name;
		}

		void sayHello() {
			System.out.println("hello, " + name);
		}

		void clear() {
			name = "";
		}
	}
}
相關文章
相關標籤/搜索