Java对象池pool2分析PooledObjectFactory过程

 更新时间:2025年02月18日 09:02:11   作者:一颗小小的石头.  
文章介绍了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 可以是:

  • 第一个 makeObject 方法 :用于对象的新建,一般是 new 出来之后包装一下。而什么时候需要新建呢,根据策略不同则时机不同。例如在没有闲置资源对象,且已存在的资源数不超过所设置的最大资源时新建。
  • 第二个 destroyObject 方法:销毁一个对象,除了很容易想到的闲置过长时间被清理掉了导致需要销毁之外,还有如果进行了第三个方法且返回了 false ,那么也是需要销毁的。
  • 第三个 validateObject方法:检验这个对象是否还有有效,借出和归还时,以及内置后台线程检测闲置情况时,可以通过验证可以去除一些不符合业务逻辑的资源对象。默认这个方法是不被调用的,要开启则需要在PoolConfig中设置setTestOnBorrow , setTestOnReturn , setTestWhileIdle等属性。

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

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

用于测试的主函数:

总结

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

相关文章

  • SpringBoot Java后端实现okhttp3超时设置的方法实例

    SpringBoot Java后端实现okhttp3超时设置的方法实例

    Okhttp的使用没有httpClient广泛,网上关于Okhttp设置代理的方法很少,下面这篇文章主要给大家介绍了关于SpringBoot Java后端实现okhttp3超时设置的相关资料,需要的朋友可以参考下
    2021-10-10
  • java实现调用http请求的五种常见方式

    java实现调用http请求的五种常见方式

    在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适,本文主要介绍了java实现调用http请求的四种常见方式,感兴趣的可以了解一下
    2024-07-07
  • MVC+DAO设计模式下的设计流程详解

    MVC+DAO设计模式下的设计流程详解

    这篇文章主要介绍了MVC+DAO设计模式下的设计流程详解,分别介绍了数据库设计、设计符合java bean标准的entity类、设计访问数据库的DAO接口等内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Spring cloud gateway工作流程原理解析

    Spring cloud gateway工作流程原理解析

    这篇文章主要介绍了Spring cloud gateway工作流程原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • JavaMail整合Spring实现邮件发送功能

    JavaMail整合Spring实现邮件发送功能

    这篇文章主要为大家详细介绍了JavaMail整合Spring实现邮件发送功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 打开.properties中文显示unicode编码问题以及解决

    打开.properties中文显示unicode编码问题以及解决

    这篇文章主要介绍了打开.properties中文显示unicode编码问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java实现一个简单TCPSocket聊天室功能分享

    java实现一个简单TCPSocket聊天室功能分享

    这篇文章主要为大家分享了java实现的一个简单TCPSocket聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • MyBatisPlus+SpringBoot实现乐观锁功能详细流程

    MyBatisPlus+SpringBoot实现乐观锁功能详细流程

    乐观锁是针对一些特定问题的解决方案,主要解决丢失更新问题,下面这篇文章主要给大家介绍了关于MyBatisPlus+SpringBoot实现乐观锁功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • MybatisPlus使用queryWrapper如何实现复杂查询

    MybatisPlus使用queryWrapper如何实现复杂查询

    这篇文章主要介绍了MybatisPlus使用queryWrapper如何实现复杂查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • Java使用WebView实现桌面程序的技术指南

    Java使用WebView实现桌面程序的技术指南

    在现代软件开发中,许多应用需要在桌面程序中嵌入 Web 页面,例如,你可能需要在 Java 桌面应用中嵌入一部分 Web 前端,或者加载一个 HTML5 界面以增强用户体验,所以本文给大家介绍了Java使用WebView实现桌面程序的技术指南,需要的朋友可以参考下
    2025-05-05

最新评论