对象池模式
优点; 复⽤池中对象,没有分配内存和创建堆中对象的开销, 没有释放内存和销毁堆中对象的开销, 进⽽减少垃圾收集器的负担, 避免内存抖动;不必重复初始化对象状态。
1. 并发环境下,对象池操作的同步成为⼀⼤开销;
4. blockWhenExhausted只是idle为空时是否等待,maxWaitMillis只是等待多久
5. 池化对象!=null;factory#activateObject
6. testOnBorrow || (create && testOnCreate) factory#validateObject
return的流程
1. 根据obj从allObjects取出polledObject p
2. 判空;将p状态置为RETURN
3. 若getTestOnReturn参数为true,进⾏factory#validateObject
4. 对p进⾏factory#passivateObject,与初始化相反
5. 更新p状态为IDLE
6. 归还Pool:Pool的idle实例达到上限或者Pool已经关闭,销毁之,否则将p加⼊到LinkedBlockingDeque中。
⾃定义对象池可以依赖GenericObjectPool以及DefaultPooledObject,只实现PooledObjectFactory即可。
对象池属性
s.pool2.impl.GenericObjectPool对象池属性,控制对象池产⽣对象的⾏为;
全部属性由s.pool2.impl.BaGenericObjectPool描述:
属性值说明
borrow:
maxTotal long;默认-1idle队列为空,idle.len < maxTotal可创建,-1时maxTotal为整数最⼤值
blockWhenExhauste d
true[默
认]/fal
idle空,maxTotal达到,是否等待队列
maxWaitMillis long;默认-1idle空,maxTotal达到blockWhenExhausted=true,等待队列时长;-1⼀直等
testOnBorrow true/fal[默
认]
borrow时,控制objFactory#validateObject
testOnCreate true/fal[默
认]
borrow时,通过create获得,控制objFactory#validateObject
return:
testOnReturn true/fal[默
认]
objPool#returnObj,控制 objFactory#validateObject
lifo
true[默
认]/fal
true-LIFO idle队列后进先出; fal-FIFO idle队列先进先出
五、⾃定义对象池
使⽤默认对象池GenericObjectPool,只需定义池化对象⼯⼚即可。官⽅提供了demo 官⽅demo
以下为简化,更容易看清本质:
池化对象⼯⼚:产⽣StringBuffer对象