SSH:git@github.com:unbelievableme/object-pool.git
HTTPS:https://github.com/unbelievableme/object-pool.git
緩沖池
設計要點:包含三個隊列:空緩沖隊列(emq),裝滿輸入數據的輸入的隊列(inq),裝滿輸出數據的輸出隊列(outq),輸入程序包括收容輸入(hin),提取輸入(sin),輸出程序包括收容輸出(hout)和提取輸出(sout)。
注意點:輸入程序和輸出程序會對緩沖區並發訪問,因此可以對緩沖區設置一個互斥信號量,或者對關於緩沖區的操作加鎖。hin,sin,hout,sout之間還有同步關系,可以通過if語句判斷決定執行先后順序
線程池
設計要點:線程池和線程一樣,也具有最基本的就緒,運行,結束,等狀態。ThreadPoolService類包含state,ThreadCount,一個線程容器,一個任務容器等成員變量,初始化時在線程容器中添加一定數目的線程(線程的初始化傳入一個this參數,說明他屬於的線程池),對於每個線程,run方法內獲得任務容器,如果容器中含有就緒的任務,就執行它,即該任務占用了該線程,線程采用輪詢(或者其他設計)的方式,執行task,
注意點:線程,任務容器都會並發訪問任務(改變任務的狀態),因此對關於任務的操作需要加鎖。
連接池
設計要點:ConnectionPool初始化時加入若干個connection,在高層通過getConnection獲得容器中的某個connection,若容器中不存在connection就再初始化一個connection(),當不需要數據庫操作的時候,傳統做法是釋放連接,而對於連接池則是在容器中,恢復對該connection的包含
注意點: 連接池存在對connection的並發訪問,因此對關於connection的操作應該加鎖
對比
相同點:無論是緩沖池,對象池還是連接池,最初的設計初衷都是為了增加系統資源的利用率,是系統開銷更多的放在具體的請求處理上而不是對象的建立和釋放上,既然都是容器,在類的設計上也有很多相似之處,例如:初始化,成員變量的設計等等。
不同點:所謂的不同點也是在相同點具體細化后產生的,例如互斥,同步信號量的定義,連接,線程,緩沖池的復用策略