池技術,主要用於管理對象,作到對象能夠重用,避免屢次建立對象的開銷,是一種比較經常使用的技術。好比DB數據源的鏈接池。redis
在Java中頻繁的建立對象和銷燬對象都會消耗性能。爲了不這種問題,咱們常會用到池技術。咱們確定據說過一些術語,好比:線程池,鏈接池。Executor調度器會管理着一個線程池,使提交的task由線程池
中的空閒狀態的線程去調度執行。咱們建立數據庫鏈接都會使用到鏈接池,像c3p0,這些都是咱們常常接觸到的池技術用到的地方。數據庫
首先單例和對象池的目的都是爲了不頻繁的建立對象帶來的系統的開銷。單例是某個對象只但願在jvm中存在一個實例,當任何其它對象調用單例對象時不會由於其它對象正在使用這個單例對象而遭到阻塞,另外也不會同時出現多個對象須要更改單例對象的狀況。換句話說,也就是說:apache
在單例對象上通常不會存在鎖,競爭的資源。安全
單例對象是一種線程安全的對象jvm
因此這樣的對象,咱們只但願建立一個就好。而對象池正好和單例的特性相反。tcp
這裏主要說下經常使用到的對象池管理組件common-pool2性能
對象池技術,主要用於管理對象,作到對象能夠重用,避免屢次建立對象的開銷。線程
common-pool2是apache開源下的對象池管理組件,是目前Java項目中使用到最廣的對象池管理組件code
在實際項目中,會有不少地方,經常使用的tcp鏈接池,好比db,redis鏈接的組件都會使用到common-pool2做爲鏈接池管理對象
common-pool2基本構思思想就是:利用一個集合來管理建立的對象,這個集合就稱之爲池
。當須要使用到對象時,從池中拿取一個空閒狀態的對象,用完以後在放入到池中。另外可讓使用者個性化的配置池的策略,
好比池對象的大小,空閒對象大小,當池中對象都處於工做狀態下對象池的增加策略,當去從對象池中拿取一個對象能夠等待的時間等。
GenericObjectPool:能夠設置池中最大的空閒個數,最大的對象實例化個數
GenericKeyedObjectPool:對於相同的key的對象池提供一樣的池策略
SoftReferenceObjectPool:基於SoftReference實現,能夠隨着須要自動增長對象的個數,而對象的回收利用gc
GenericObjectPool池利用LinkedBlockingDeque做爲對象管理的容器和一個名爲idle object eviction
的驅逐線程定時查看空閒的對象,來保證空閒的對象不會超過用戶的設置。
SoftReferenceObjectPool池借組與SoftReference引用能夠在內存吃緊時被gc自動回收來管理對象池中的對象,它能夠隨着對對象的須要而不斷增長。與GenericObjectPool池比起來少了一個驅逐線程去回收空閒的對象和無用的對象。