java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java对象池pool2分析PooledObjectFactory

Java对象池pool2分析PooledObjectFactory过程

作者:一颗小小的石头.

文章介绍了Java中对象池化技术的背景,以Apache的Pool2库为例,详细讲解了GenericObjectPool的构造函数参数和PooledObjectFactory接口的实现,通过商场里的共享充电宝的比喻,说明了池化思维的应用

背景

池化技术 在Java中使用的相当多了,例如各种数据库连接池,以及JDK自己实现的线程池等等,从根本上说他们都是对象池,把资源池化,按需存取,不仅能够一定程度上节省对象的创建时间(缓存思想),还能够对池子做一些管理和控制(例如设置资源最大数,闲置数等等)。

池的经典实现要数 apache 的 pool2 了 .

Pool2

默认的对象池是 GenericObjectPool

通过最核心的 borrowObject 和 returnObject 方法进行对象的取和归还。

但是在 GenericObjectPool 的构造函数中有两个参数。

GenericObjectPool<MyObject> objectPool =
new GenericObjectPool<>(new MyPooledObjectFactory(),new GenericObjectPoolConfig());

其中第二个是GenericObjectPoolConfig类,里面是关于Pool的一些配置,例如最大资源数,最大,最小闲置数。它继承了BaseObjectPoolConfig类,里面有关于空闲资源的清理策略,资源争夺属性,等待超时时间等等很多复杂的属性,详见源码。

这里主要说的是第一个参数 PooledObjectFactory ,他是唯一需要我们自己去实现的地方,很明显是一个工厂,用于 生产,销毁,激活,验证 我们的池化资源对象。

注意:

放入池中的资源被包装成了 PooledObject 类型的对象,之所以包装,是因为向其中添加了很多属性,例如资源对象的状态,等待时间,闲置时间,最后一次使用的时间,借出次数等等属性。类似于JDK线程池放入的 Runnble对象会被包装成Worker对象一样。

这里以商场里的共享充电宝为例,这个简单来说就是一个池化的思维。

每个充电宝只有一个属性,那就是剩余电量。用于模拟,只有一个方法,就是借出去被使用。

那么我们需要自己实现的 PooledObjectFactory 可以是:

第一个 activeObject 方法: 在借用一个对象的时候调用,则可以在此重置其内部状态,那么返回的对象就像新的一样,例如这里重置电量

第一个 passivateObject 方法: 对应 activateObject 方法,是在归还一个对象的时候调用,注意不应与activateObject方法有业务逻辑上的冲突

用于测试的主函数:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文