common-pool2
池技术
池技术,主要用于管理对象,做到对象可以重用,避免多次创建对象的开销,是一种比较常用的技术。比如DB数据源的连接池。
在Java中频繁的创建对象和销毁对象都会消耗性能。为了避免这种问题,我们常会用到池技术。我们肯定听说过一些术语,比如:线程池,连接池。Executor调度器会管理着一个线程池,使提交的task由线程池
中的空闲状态的线程去调度执行。我们创建数据库连接都会使用到连接池,像c3p0,这些都是我们经常接触到的池技术用到的地方。
单例与对象池的区别
首先单例和对象池的目的都是为了避免频繁的创建对象带来的系统的开销。单例是某个对象只希望在jvm中存在一个实例,当任何其它对象调用单例对象时不会因为其它对象正在使用这个单例对象而遭到阻塞,另外也不会同时出现多个对象需要更改单例对象的情况。换句话说,也就是说:
在单例对象上一般不会存在锁,竞争的资源。
单例对象是一种线程安全的对象
所以这样的对象,我们只希望创建一个就好。而对象池正好和单例的特性相反。
这里主要说下常用到的对象池管理组件common-pool2
common-pool2
对象池技术,主要用于管理对象,做到对象可以重用,避免多次创建对象的开销。
common-pool2是apache开源下的对象池管理组件,是目前Java项目中使用到最广的对象池管理组件
在实际项目中,会有很多地方,常用的tcp连接池,比如db,redis连接的组件都会使用到common-pool2作为连接池管理
common-pool2基本构思思想就是:利用一个集合来管理创建的对象,这个集合就称之为池
。当需要使用到对象时,从池中拿取一个空闲状态的对象,用完之后在放入到池中。另外可以让使用者个性化的配置池的策略,
比如池对象的大小,空闲对象大小,当池中对象都处于工作状态下对象池的增长策略,当去从对象池中拿取一个对象可以等待的时间等。
3种对象池管理方式
GenericObjectPool:可以设置池中最大的空闲个数,最大的对象实例化个数
GenericKeyedObjectPool:对于相同的key的对象池提供同样的池策略
SoftReferenceObjectPool:基于SoftReference实现,可以随着需要自动增加对象的个数,而对象的回收利用gc
GenericObjectPool
GenericObjectPool池利用LinkedBlockingDeque作为对象管理的容器和一个名为idle object eviction
的驱逐线程定时查看空闲的对象,来保证空闲的对象不会超过用户的设置。
SoftReferenceObjectPool
SoftReferenceObjectPool池借组与SoftReference引用可以在内存吃紧时被gc自动回收来管理对象池中的对象,它可以随着对对象的需要而不断增加。与GenericObjectPool池比起来少了一个驱逐线程去回收空闲的对象和无用的对象。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。