上一篇文章中提到,提高 Java 程序的性能的一個基本想法是,減少頻繁的對象創建和銷燬。
最近仔細分析了一下自己的一個程序,因爲這個程序需要進行大量的字符串操作,會大量新建出臨時的 StringBuffer 對象,這種對象用完一次就扔。尤其是在一個函數中,每次調用這個函數的時候都新建一個 StringBuffer ,函數退出的時候這個 StringBuffer 就沒用了,而這個函數會被調用上萬次,積累下來對性能的損耗可想而知。
所以我想到了使用對象池技術:每次用完 StringBuffer 並不銷燬,而是把它存在那裏,下次要用的時候只需要調用 setLength(0) 就又可以再次利用了,低碳環保。
正好看到 Apache Commons 有個 commons-pool(http://commons.apache.org/pool/),一種實現對象池的框架。於是試用了一下。
commons-pool 對對象池的抽象是:
“借出”對象和“歸還”對象,這個用詞很生動形象。
在池中的對象有兩種狀態:active 表示這個對象正在被程序使用;idle 空閒態,表示該對象在池中空閒,可以被分配出去。
於是我們不難理解如下配置:
maxIdle :指定空閒對象的最大數目。如果空閒對象超出這個值,GenericObjectPool 會清理空閒對象,減少到這個值。這是爲了避免池中的對象過多,會佔用過多的內存。
好了,廢話不多說,直接上代碼:
在理解了對象池的實現原理之後,我們也可以自己實現一個,下面是我自己實現的簡單 StringBuffer 池:
這裏使用 Hashtable 來保證線程安全。