什麼是物件池
“池” 是什麼,我們聯想到池塘,用來養魚的。我們可以隨時撈兩條魚出來,滿足我們的飽腹之慾。
這裡突出兩個概念,一個是“養”,即是儲存並保鮮著;一個是“隨時”,就是方便取用的意思。
如果自家沒有池塘,要吃魚會怎麼辦,就是要開車到集市中買兩條魚回來做,不方便。
在開發中我們會經常遇到池的概念,比如執行緒池啊,資料庫連線池啊等等。當然這些都屬於遠端連線的一些池的處理。我們理解的就是為了加快訪問速度,建立的這些池的處理。
我們可以說池的技術可以有以下這些好處:
1.物件開始就建立好了,不需要重新建立,拿出來就可以用,比如記憶體空間的初始化。
2.io可以複用,io的低延遲性拖累了整個系統的吞吐量,尤其是在io建立流或連線上,通過一次性建立後續保持複用,避免首次建立重新連線。
通過這兩點好處還會帶來以下的一些特徵:
1.由於池的大小固定性,也避免了資源不停的做橫向獲取的浪費。
2.物件重複使用,記憶體穩定,減少記憶體回收機率。
整個池在整個程式類似一個單例,就如同每個執行緒可知道有這個池塘,都可以去這個池塘拿出一個內容出來用。比如拿出來直接計算。
但是到這裡大家可能會覺得這個不就是一個容器麼,放著我我已經初始化好了的物件,是不是和Java的Spring容器很像,但是池還會有更多的內容,比如物件的狀態,是否能用,物件的心跳保持,保證新鮮等。
我們希望池都有哪些功能,比如建立的大小,建立的方法,當物件有問題銷燬的方法,如何發現有問題的檢測方法;還有就是取用的時候,別人可以不被取到,同時當整個池都用完之後,有足夠的應對措施保證取用的正確性。比如給使用者報告----我不夠用了,或是說你先在這等等,等一個人用完了你再拿過去用。
下面我們來看看Java的包中一個比較好用的一個物件池,Apache-common-pool。
首先這個物件池的工具有個介面(ObjectPool),該介面可以被我們實現為具體的池的操作。此介面含有兩個重要的方法,borrowObject() 和 returnObject(),一個是借(取),一個是還。另外為了整個池的初始化時需要往池中新增元素物件,也就是還有addObject()方法。在我們使用的時候,如果發現池中某個元素物件有問題,希望釋放掉它,那麼還有 invalidateObject()方法。到現在為止我們知道了有這麼一個介面,實現建立,用還,失效等生命週期的管理。
大家可以使用該介面做簡單的池的處理實踐。