java對象池ObjectPool

轉自:http://reallyafei.iteye.com/blog/372893

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

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

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

PoolableObjectFactory 定義了池化對象的生命週期方法,我們可以使用它分離被池化的不同對象和管理對象的創建,持久,銷燬。
BasePoolableObjectFactory這個實現PoolableObjectFactory 接口的一個抽象類,我們可用擴展它實現自己的池化工廠。

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

 

  1. package tf;   
  2.    
  3. import org.apache.commons.pool.BasePoolableObjectFactory;   
  4. import org.apache.commons.pool.ObjectPool;   
  5. import org.apache.commons.pool.impl.StackObjectPool;   
  6.    
  7. public class Pool {   
  8.    
  9.     public static void main(String[] args) throws Exception {   
  10.         ObjectPool pool = new StackObjectPool(new UserFactory());   
  11.         User u = (User) pool.borrowObject(); // 從池中借出一個對象   
  12.         u.setName("me");   
  13.         u.sayHello();   
  14.         pool.returnObject(u); // 歸還對象   
  15.     }   
  16.    
  17.     static class UserFactory extends BasePoolableObjectFactory {   
  18.         /**  
  19.          * 產生一個新對象  
  20.          */   
  21.         public Object makeObject() {   
  22.             return new User();   
  23.         }   
  24.    
  25.         /**  
  26.          * 還原對象狀態  
  27.          */   
  28.         public void passivateObject(Object obj) {   
  29.             User u = (User) obj;   
  30.             u.clear();   
  31.         }   
  32.     }   
  33.    
  34.     static class User {   
  35.         String name;   
  36.    
  37.         void setName(String name) {   
  38.             this.name = name;   
  39.         }   
  40.    
  41.         void sayHello() {   
  42.             System.out.println("hello, " + name);   
  43.         }   
  44.    
  45.         void clear() {   
  46.             name = "";   
  47.         }   
  48.     }   
  49. }   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章