`
cywhoyi
  • 浏览: 421279 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

轻量级的对象池

阅读更多

Pool在N多环境下碰到,比如连接池、线程池、缓存池...

当某一对象从池中取得,那只有等待被用完放回去以后,其它的线程才能再次从池中获取。对象在池中是具有自己生命周期:创建、验证、使用、销毁等等。Pool的方式也许是最好的方式用来管理同一的资源。

 

运用的场景:

高频率的运用同一的资源

对象大且很消耗内存(DB连接)

需要长时间的初始化

IO消耗大

对象非线程安全

 

Apache Commons Pool 提供其轻量级的作用,不过它并未使用JDK1.5之后的Execute的框架,这是我觉得可能比较可惜的,就如同Proxool跟Boncp比较,性能指标提升最大一个就是分区和使用Execute、Guava等性能提升比较大的工具包。

 

import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public abstract class ObjectPool<T> {
	private ConcurrentLinkedQueue<T> pool;

	private ScheduledExecutorService executorService;

	/**
	 * Creates the pool.
	 * 
	 * @param minIdle
	 *            初始化最小的对象池中对象创建数量
	 */
	public ObjectPool(final int minIdle) {
		// initialize pool
		initialize(minIdle);
	}

	/**
	 * Pool创建
	 * 
	 * @param minIdle
	 *            最小的数量
	 * @param maxIdle
	 *            最大数量
	 * @param validationInterval
	 *            检查最大/最小的池中的对象的频率
	 */
	public ObjectPool(final int minIdle, final int maxIdle,
			final long validationInterval) {
		// initialize pool
		initialize(minIdle);

		// check pool conditions in a separate thread
		executorService = Executors.newSingleThreadScheduledExecutor();
		executorService.scheduleWithFixedDelay(new Runnable() {
			@Override
			public void run() {
				int size = pool.size();
				if (size < minIdle) {
					int sizeToBeAdded = minIdle - size;
					for (int i = 0; i < sizeToBeAdded; i++) {
						pool.add(createObject());
					}
				} else if (size > maxIdle) {
					int sizeToBeRemoved = size - maxIdle;
					for (int i = 0; i < sizeToBeRemoved; i++) {
						pool.poll();
					}
				}
			}
		}, validationInterval, validationInterval, TimeUnit.SECONDS);
	}

	/**
	 * 获取对象,如果没有,那就创建且返回
	 * 
	 * @return T borrowed object
	 */
	public T borrowObject() {
		T object;
		if ((object = pool.poll()) == null) {
			object = createObject();
		}

		return object;
	}

	/**
	 * Returns object back to the pool.
	 * 
	 * @param object
	 *            object to be returned
	 */
	public void returnObject(T object) {
		if (object == null) {
			return;
		}

		this.pool.offer(object);
	}

	/**
	 * Shutdown this pool.
	 */
	public void shutdown() {
		if (executorService != null) {
			executorService.shutdown();
		}
	}

	/**
	 * Creates a new object.
	 * 
	 * @return T new object
	 */
	protected abstract T createObject();

	private void initialize(final int minIdle) {
		pool = new ConcurrentLinkedQueue<T>();

		for (int i = 0; i < minIdle; i++) {
			pool.add(createObject());
		}
	}
}

 抽象池中主要提供borrowObject 是在具体实现类中可存放任意的对象,附件中存有测试代码。

分享到:
评论
1 楼 hngmduyi 2014-08-19  
  

相关推荐

    Java对象池实现源码

    在Java编程中,对象池是一种优化资源管理的技术,...我们可以借鉴Jakarta Commons Pool的设计思路,实现自己的轻量级对象池,满足特定场景的需求。理解并熟练运用对象池,对于提升Java应用的性能和资源利用率至关重要。

    轻量级内存池

    轻量级内存池设计的目标是提供一个高效、易用且线程安全的解决方案,尤其适用于多线程环境中的短生命周期对象。 在C++中,内存池通常通过自定义的数据结构来实现,例如`BufPool`可能就是这样一种结构。`BufPool.cpp...

    EasyObjectsPool(一个简单的Unity对象池插件)

    EasyObjectsPool就是这样一款专为Unity开发者设计的轻量级对象池插件,它的出现使得对象池的实现变得简单易用。 一、EasyObjectsPool的基本概念与作用 1.1 对象池原理:对象池机制类似于现实生活中的资源库,将...

    Unity 2019.4.15f1 高效轻量对象池插件 最新版本

    资源介绍 ... A lightweight object pool. You need to create an ...轻量级对象池。 你需要在场景中创建一个对象,然后挂起它。 支持自动扩容。 支持回收检测。 支持父节点回收 同时自动回收自身挂的所有对象池组件

    C++ 内存池 轻量级实现

    下面将详细介绍内存池的原理、实现方式以及轻量级实现中的关键点。 内存池的基本思想是将内存的申请和释放过程集中管理。通常,系统默认的内存分配器(如C++的`new`和`delete`)在分配小块内存时会有一定的开销,...

    Spring轻量级与EJB重量级容器的比较

    标题:“Spring轻量级与EJB重量级容器的比较” 描述:“我自己做的第一个文档” 标签:“容器” 部分内容:本文档旨在深入探讨Spring轻量级容器与EJB重量级容器的区别,通过对这两个概念的剖析,帮助读者理解它们...

    PHP轻量级数据库框架PHP更简单高效的数据库操作方式

    1. **查询构造器**:许多轻量级框架如Phalcon、Laravel的Eloquent、Doctrine等都提供了查询构造器,允许开发者通过链式调用来构建复杂的SQL查询,而无需直接编写SQL语句。这种方式降低了SQL注入的风险,并提高了代码...

    Unity中对象池插件

    2. **Easy Object Pool**:轻量级且易于理解的插件,适用于小型项目和初学者。 3. **Unity Asset Store搜索“Pooling”**:Asset Store中还有许多其他优秀的选择,可以根据项目需求和评价选择适合的插件。 ### ...

    轻量级Java EE企业应用实战第三版第二章源码

    在《轻量级Java EE企业应用实战第三版》中,第二章主要探讨了Java EE的基础概念和核心组件,以及如何构建轻量级的企业级应用程序。本章源码提供了实际操作的示例,帮助读者深入理解Java EE开发的关键技术。下面我们...

    对象池工厂(微型IOC容器)

    标题中的“对象池工厂(微型IOC容器)”是一个关于软件设计模式和轻量级依赖注入框架的概念。对象池是一种优化技术,用于管理对特定类型对象的创建和复用,以提高性能,减少系统资源的消耗。它通过维护一个对象集合来...

    《Java_Web轻量级开发全体验》PDF

    《Java_Web轻量级开发全体验》这本书深入浅出地介绍了使用Java技术进行Web应用程序开发的方法和实践。这本书的核心内容涵盖了Java Web开发中的多个重要知识点,包括但不限于以下几个方面: 1. **Java基础**:首先,...

    轻量级orm框架源码

    ORM(Object-Relational Mapping,对象关系...通过对这些知识点的深入学习,开发者不仅可以掌握轻量级ORM框架的使用,还能提升在数据库操作和面向对象编程方面的技能,这对于任何涉及到数据库操作的项目都是宝贵的财富。

    基于struts+spring+ibatis的轻量级J2EE开发

    标题 "基于struts+spring+ibatis的轻量级J2EE开发" 指向的是一个关于使用Struts、Spring和iBatis这三种开源框架进行轻量级Java企业级应用开发的主题。这个组合通常被称为SSM(Struts、Spring、MyBatis)框架集成,是...

    mormot轻量级中间件.zip

    这个轻量级中间件包含了一系列的组件,如配置文件、数据库连接池、JSON序列化和Unidac驱动支持,这些都是构建现代应用程序不可或缺的部分。 首先,`clean.bat`是一个批处理文件,通常用于清理项目生成过程中的临时...

    cpp-Raft核心算法的一个轻量级C实现可作为一个复制库

    NuRaft 库是这个轻量级 C++ 实现的核心,它包含了以下关键组件: 1. **服务器状态机(Server State Machine)**:每个节点都有一个状态机,用于处理客户端的请求并存储最终一致的状态。 2. **日志(Log)**:存储了...

    轻量级Java EE企业应用实战第三版第一章源码

    在本资源中,我们关注的是"轻量级Java EE企业应用实战第三版第一章源码"。这通常是指一本关于使用轻量级Java EE框架构建企业级应用的书籍的配套代码,第一章的源码部分。轻量级Java EE指的是不依赖大型、重型容器如...

    轻量级封装jdbc 实现增删改查

    因此,为了提高开发效率和代码的可读性,通常会进行轻量级的JDBC封装,这就是“轻量级jdbc 封装类”的概念。 轻量级JDBC封装类的目标是简化上述流程,提供更简洁、易用的API,同时保持灵活性,以便在不依赖大型ORM...

    GeneralPoolManager:用C#编写的方便的通用池管理器

    通用泳池经理一个轻量级对象池实现示例 class MyClass{}class MyResetableClass : IPoolable{ public void ResetState(){ // reset the state of this object }} void Demo(){ var o = PoolManager.Instance....

    HDF reader 读取HDF数据集文件专用轻量级软件

    标题中的“HDF reader 读取HDF数据集文件专用轻量级软件”指的是一个专门用来读取HDF格式数据的轻量级工具。这类软件通常具有简洁的用户界面和高效的性能,使得用户能够方便地访问和探索HDF文件中的数据内容。 描述...

Global site tag (gtag.js) - Google Analytics