Java对象池pool2分析PooledObjectFactory

背景:

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

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

Pool2

默认的对象池是 GenericObjectPool
通过最核心的 borrowObject 和 returnObject 方法进行对象的取和归还。
Java对象池pool2分析PooledObjectFactory_第1张图片

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

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

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

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

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

这里以商场里的共享充电宝为例,这个简单来说就是一个池化的思维。
Java对象池pool2分析PooledObjectFactory_第2张图片

每个充电宝只有一个属性,那就是剩余电量。用于模拟,只有一个方法,就是借出去被使用。
Java对象池pool2分析PooledObjectFactory_第3张图片

那么我们需要自己实现的 PooledObjectFactory 可以是:
Java对象池pool2分析PooledObjectFactory_第4张图片
第一个 makeObject 方法 :用于对象的新建,一般是 new 出来之后包装一下。而什么时候需要新建呢,根据策略不同则时机不同。例如在没有闲置资源对象,且已存在的资源数不超过所设置的最大资源时新建。

第二个 destroyObject 方法:销毁一个对象,除了很容易想到的闲置过长时间被清理掉了导致需要销毁之外,还有如果进行了第三个方法且返回了 false ,那么也是需要销毁的。

第三个 validateObject方法:检验这个对象是否还有有效,借出和归还时,以及内置后台线程检测闲置情况时,可以通过验证可以去除一些不符合业务逻辑的资源对象。默认这个方法是不被调用的,要开启则需要在PoolConfig中设置setTestOnBorrow , setTestOnReturn , setTestWhileIdle等属性。

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

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

用于测试的主函数:
Java对象池pool2分析PooledObjectFactory_第5张图片

你可能感兴趣的:(Java)