SSH:[email protected]:unbelievableme/object-pool.git HTTPS:https://github.com/unbelievableme/object-pool.git 緩衝池 設計要點:包含三個隊列:空緩衝隊列(emq),裝滿輸入數據的輸入的隊列(inq) ...
SSH:[email protected]: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的操作應該加鎖
對比
相同點:無論是緩衝池,對象池還是連接池,最初的設計初衷都是為了增加系統資源的利用率,是系統開銷更多的放在具體的請求處理上而不是對象的建立和釋放上,既然都是容器,在類的設計上也有很多相似之處,例如:初始化,成員變數的設計等等。
不同點:所謂的不同點也是在相同點具體細化後產生的,例如互斥,同步信號量的定義,連接,線程,緩衝池的復用策略