对象池中存放的都是一些创建特别耗资源的对象,每次使用都创建很耗资源,所以用对象池预先创建一些对象,需要时从池中取出对象,不需要时将对象放回池中,提高代码效率。
Apache Commons Pool
池对象工厂:
PooledObjectFactory(2.0以前叫PoolableObjectFactory)
PooledObjectFactory必是线程安全的,同一个对象同一时间不会被重复使用。
实现这个接口需要重写五个方法
makeObject:需要对象时使用
validateObject:可在activateObject后调用,确保对象可被还回对象池;可在passivateObject前调用,确保对象可被还回对象池
activateObject:取出对象时,需要activate
passivateObject:还回对象时,需要passivate
destroyObject:对象从对象池中废弃时调用
KeyedPooledObjectFactory与PooledObjectFactory类似,只是多了key参数
KeyedPooledObjectFactory<K,V> vs PoolableObjectFactory<T>
对象池:
GenericObjectPool
可设置对象池特征:LIFO(后进先出)方式、最大最小空闲数、有效性检查。
GenericKeyedObjectPool
对应KeyedPooledObjectFactory
SoftReferenceObjectPool
使用ArrayList保存对象池里的对象,对象池里不保存对象本身,而是保存它们的软引用
特点:可以保存任意多个对象,对象池不会满;取出对象时,如果对象池已空,会创建新对象;内存不足时,池中对象可以回收。
对象池设计
http://ifeve.com/generic-concurrent-object-pool/