2013-11-26 64 views
1

我想了解一個飛錘設計模式有效地用於創建共享對象池。這個需求來自於Java EE基於web的應用程序的性能改進清單。Flyweight設計模式來創建共享對象池

對於經常使用的複雜對象,我考慮一個可回收對象池,而不是總是實例化新對象。

現在請讓我怎麼輕量級設計模式可用於創建的寶貴的系統資源像 池 - 線程 - 數據庫連接 - 套接字連接等

回答

3

對於資源池,你需要:

  • 池化資源(可能是一個陣列或資源的集合)
  • 一種方式來創建resourc es(可以預先創建所有資源,或按需創建懶惰)
  • 向資源保護訪問。資源必須是已獲得已發佈當它們不再需要時。當所有資源被佔用時,嘗試獲取資源必須阻止,直到資源被釋放。

aquire-release部分可以使用Semaphore實現,其中池大小是Semaphore上的許可數。如果你遵循the link to the JavaDoc中,不過已經這樣一個池的例子:

(代碼JavaDoc

class Pool { 
    private static final int MAX_AVAILABLE = 100; 
    private final Semaphore available = new Semaphore(MAX_AVAILABLE, true); 

    public Object getItem() throws InterruptedException { 
    available.acquire(); 
    return getNextAvailableItem(); 
    } 

    public void putItem(Object x) { 
    if (markAsUnused(x)) 
     available.release(); 
    } 

    // Not a particularly efficient data structure; just for demo 

    protected Object[] items = ... whatever kinds of items being managed 
    protected boolean[] used = new boolean[MAX_AVAILABLE]; 

    protected synchronized Object getNextAvailableItem() { 
    for (int i = 0; i < MAX_AVAILABLE; ++i) { 
     if (!used[i]) { 
      used[i] = true; 
      return items[i]; 
     } 
    } 
    return null; // not reached 
    } 

    protected synchronized boolean markAsUnused(Object item) { 
    for (int i = 0; i < MAX_AVAILABLE; ++i) { 
     if (item == items[i]) { 
      if (used[i]) { 
      used[i] = false; 
      return true; 
      } else 
      return false; 
     } 
    } 
    return false; 
    } 

} 
+0

很好的例子彼得,謝謝 –