Java对象池pool2分析PooledObjectFactory

2 篇文章 0 订阅

背景:

    池化技术 在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 可以是:
在这里插入图片描述
第一个 makeObject 方法 :用于对象的新建,一般是 new 出来之后包装一下。而什么时候需要新建呢,根据策略不同则时机不同。例如在没有闲置资源对象,且已存在的资源数不超过所设置的最大资源时新建。

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

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

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

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

用于测试的主函数:
在这里插入图片描述

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例,展示如何在Java代码中使用对象: 1. 创建对象类: ```java import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class ObjectPool<T> { private BlockingQueue<T> pool; public ObjectPool(int poolSize) { pool = new LinkedBlockingQueue<>(poolSize); } public T borrowObject() throws InterruptedException { return pool.take(); } public void returnObject(T object) throws InterruptedException { pool.put(object); } } ``` 2. 创建需要重复使用的对象类: ```java public class MyObject { // Your object's properties and methods } ``` 3. 在代码中使用对象: ```java public class Main { public static void main(String[] args) { ObjectPool<MyObject> objectPool = new ObjectPool<>(10); try { // Borrow an object from the pool MyObject obj1 = objectPool.borrowObject(); // Use the object // ... // Return the object to the pool objectPool.returnObject(obj1); // Borrow another object from the pool MyObject obj2 = objectPool.borrowObject(); // Use the object // ... // Return the object to the pool objectPool.returnObject(obj2); // ... } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在上述示例中,`ObjectPool`类是一个简单的对象实现,使用`BlockingQueue`来存储对象。通过`borrowObject()`方法从对象中获取对象,使用完后通过`returnObject()`方法将对象归还给对象。 注意,在实际使用中,你需要根据具体的需求和场景来实现更复杂的对象逻辑,例如处理对象为空时的等待和对象创建等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值