exp: 对象池化

可以利用apache commons-pool2自定义对象池。

看个例子,https://blog.csdn.net/qq447995687/article/details/80233621

有个实体类T,工厂类TFactory,运行池类TPool

工厂类作用?有哪些方法?
析:创建实体对象 create() ;
把对象池化,是对对象的一个包装,加上了对象的一些其他信息,包括对象的状态(已用、空闲),对象的创建时间等。
    @Override
    public PooledObject<T> wrap(T t) {
        return new DefaultPooledObject<>(t);
    }
。。。等等 
只有被池化的对象才可以放进pool里从池子里进行借还!!

运行池类TPool作用?
析:Pool类的构造方法里有factory和对pool配置的config信息,也就是pool将生产池化对象PooledObject的任务交给factory,pool里可以myPool.borrowObject();myPool.returnObject(。。)等

参考:https://www.cnblogs.com/jinzhiming/p/5120623.html
GenericObjectPool原理?
数据结构:ConcurrentHashMap和LinkedBlockingDeque。
前者用于存储所有的对象(不含销毁的对象),后者用于存储前面使用过目前空闲的对象。
borrowObject()大体思路如下
1 从LinkedBlockingDeque中pollFirst
2 若为空,检查对象池对象是否达到上限,若是重复1,若否,则调用PooledObjectFactory的makeObject去创建一个对象
3 得到对象之后,对对象进行初始化和一些配置的计数处理,同时将对象加入到ConcurrentHashMap。
returnObject(T obj)大体思路如下
1 根据obj从ConcurrentHashMap拿到其对应的PooledObject p
2 判空;将p状态置为RETURN
3 若getTestOnReturn参数为true,进行validateObject
4 对p进行passivateObject,与初始化相反
5 更新p状态为IDLE
6 归还Pool:Pool的idle实例达到上限或者Pool已经关闭,销毁之,否则将p加入到LinkedBlockingDeque中。

更细致讲解见:https://www.cnblogs.com/jinzhiming/p/5120623.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值