對象池模式 對象池模式, 或者稱為對象池服務, 其意圖為: 通過迴圈使用對象, 減少資源在初始化和釋放時的昂貴損耗(這裡的"昂貴"可能是時間效益(如性能), 也可能是空間效益(如並行處理), 在大多情況下, 指性能) 簡單的說, 在需要時,從池中提取,不用時,放回池中,等待下一個請求. 典型的例子是 ...
對象池模式
對象池模式, 或者稱為對象池服務, 其意圖為: 通過迴圈使用對象, 減少資源在初始化和釋放時的昂貴損耗(這裡的"昂貴"可能是時間效益(如性能), 也可能是空間效益(如並行處理), 在大多情況下, 指性能)
簡單的說, 在需要時,從池中提取,不用時,放回池中,等待下一個請求. 典型的例子是連接池和線程池.
類圖如下:
其中角色如下:
- ObjectPool 對象池角色: 提供對象池, 其中有兩個公共方法, checkOut負責從池中提取對象, checkIn負責回收對象(很多時候,checkIn已經自動化處理,不需要顯示生命, 如連接池)
對象池實例代碼:
這是一個簡單的對象池實現,在實際應用中還需要考慮池的最小值、最大值、池化對象狀態(若有,重點考慮)、異常處理(如滿池情況)等方面,特別是池化對象狀態,若是有狀態的業務對象則需要重點關註.
把對象池化的本意是期望一次性初始化所有對象,減少對象在初始化上的昂貴性能開銷,從而提高系統整體性能. 然而池化處理本身也要付出代價, 因此,並非任何情況下都適合採用對象池化.
通常情況下, 在重覆生成對象的操作成為影響性能的關鍵時,才適合進行對象池化.但是若池化所能帶來的性能提高並不顯著或重要的話,建議放棄對象池化技術,以保持代碼的簡明,轉而使用更好的硬體來提高性能為佳.
對象池技術在Java領域已經非常成熟, 只要做過企業級開發的人員,基本都用過 C3P0、DBCP、Proxool等連接池, 這是對象池模式的典型應用. 在實際開發中若需要對象池, 建議使用 common-pool 工具包來實現, 簡單、快捷、高效.