`
- 浏览:
49079 次
- 性别:
- 来自:
上海
-
通用对象池的实现
对象池的构造和管理可以按照多种方式实现。最灵活的方式是将池化对象的Class类型在对象池之外指定,即在ObjectPoolFactory类创建对象池时,动态指定该对象池所池化对象的Class类型,其实现代码如下:
. . .
public ObjectPool createPool(ParameterObject paraObj,Class clsType) {
return new ObjectPool(paraObj, clsType);
}
. . .
其中,paraObj参数用于指定对象池的特征属性,clsType参数则指定了该对象池所存放对象的类型。对象池(ObjectPool)创建以后,下面就是利用它来管理对象了,具体实现如下:
public class ObjectPool {
private ParameterObject paraObj;//该对象池的属性参数对象
private Class clsType;//该对象池中所存放对象的类型
private int currentNum = 0; //该对象池当前已创建的对象数目
private Object currentObj;//该对象池当前可以借出的对象
private Vector pool;//用于存放对象的池
public ObjectPool(ParameterObject paraObj, Class clsType) {
this.paraObj = paraObj;
this.clsType = clsType;
pool = new Vector();
}
public Object getObject() {
if (pool.size() < = paraObj.getMinCount()) {
if (currentNum < = paraObj.getMaxCount()) {
//如果当前池中无对象可用,而且已创建的对象数目小于所限制的最大值,就利用
//PoolObjectFactory创建一个新的对象
PoolableObjectFactory objFactory =PoolableObjectFactory.getInstance();
currentObj = objFactory.create Object (clsType);
currentNum++;
} else {
//如果当前池中无对象可用,而且所创建的对象数目已达到所限制的最大值,
//就只能等待其它线程返回对象到池中
synchronized (this) {
try {
wait();
} catch (InterruptedException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
currentObj = pool.firstElement();
}
}
} else {
//如果当前池中有可用的对象,就直接从池中取出对象
currentObj = pool.firstElement();
}
return currentObj;
}
public void returnObject(Object obj) {
// 确保对象具有正确的类型
if (obj.isInstance(clsType)) {
pool.addElement(obj);
synchronized (this) {
notifyAll();
}
} else {
throw new IllegalArgumentException("该对象池不能存放指定的对象类型");
}
}
}
从上述代码可以看出,ObjectPool利用一个java.util.Vector作为可扩展的对象池,并通过它的构造函数来指定池化对象的 Class类型及对象池的一些属性。在有对象返回到对象池时,它将检查对象的类型是否正确。当对象池里不再有可用对象时,它或者等待已被使用的池化对象返 回池中,或者创建一个新的对象实例。不过,新对象实例的创建并不在ObjectPool类中,而是由PoolableObjectFactory类的 createObject方法来完成的,具体实现如下:
. . .
public Object createObject(Class clsType) {
Object obj = null;
try {
obj = clsType.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
. . .
这样,通用对象池的实现就算完成了,下面再看看客户端(Client)如何来使用它,假定池化对象的Class类型为StringBuffer:
. . .
//创建对象池工厂
ObjectPoolFactory poolFactory = ObjectPoolFactory. getInstance ();
//定义所创建对象池的属性
ParameterObject paraObj = new ParameterObject(2,1);
//利用对象池工厂,创建一个存放StringBuffer类型对象的对象池
ObjectPool pool = poolFactory.createPool(paraObj,String Buffer.class);
//从池中取出一个StringBuffer对象
StringBuffer buffer = (StringBuffer)pool.getObject();
//使用从池中取出的StringBuffer对象
buffer.append("hello");
System.out.println(buffer.toString());
. . .
可以看出,通用对象池使用起来还是很方便的,不仅可以方便地避免频繁创建对象的开销,而且通用程度高。但遗憾的是,由于需要使用大量的类型定型 (cast)操作,再加上一些对Vector类的同步操作,使得它在某些情况下对性能的改进非常有限,尤其对那些创建周期比较短的对象。
专用对象池的实现
由于通用对象池的管理开销比较大,某种程度上抵消了重用对象所带来的大部分优势。为解决该问题,可以采用专用对象池的方法。即对象池所池化对象的 Class类型不是动态指定的,而是预先就已指定。这样,它在实现上也会较通用对象池简单些,可以不要ObjectPoolFactory和 PoolableObjectFactory类,而将它们的功能直接融合到ObjectPool类,具体如下(假定被池化对象的Class类型仍为 StringBuffer,而用省略号表示的地方,表示代码同通用对象池的实现):
public class ObjectPool {
private ParameterObject paraObj;//该对象池的属性参数对象
private int currentNum = 0; //该对象池当前已创建的对象数目
private StringBuffer currentObj;//该对象池当前可以借出的对象
private Vector pool;//用于存放对象的池
public ObjectPool(ParameterObject paraObj) {
this.paraObj = paraObj;
pool = new Vector();
}
public StringBuffer getObject() {
if (pool.size() < = paraObj.getMinCount()) {
if (currentNum < = paraObj.getMaxCount()) {
currentObj = new StringBuffer();
currentNum++;
}
. . .
}
return currentObj;
}
public void returnObject(Object obj) {
// 确保对象具有正确的类型
if (StringBuffer.isInstance(obj)) {
. . .
}
}
结束语
恰当地使用对象池技术,能有效地改善应用程序的性能。目前,对象池技术已得到广泛的应用,如对于网络和数据库连接这类重量级的对象,一般都会采用对象池技术。但在使用对象池技术时也要注意如下问题:
·并非任何情况下都适合采用对象池技术。基本上,只在重复生成某种对象的操作成为影响性能的关键因素的时候,才适合采用对象池技术。而如果进行池化所能带来的性能提高并不重要的话,还是不采用对象池化技术为佳,以保持代码的简明。
·要根据具体情况正确选择对象池的实现方式。如果是创建一个公用的对象池技术实现包,或需要在程序中动态指定所池化对象的Class类型时,才选择通用对象池。而大部分情况下,采用专用对象池就可以了。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
通过以上内容的详细介绍,我们不仅了解了Java对象池技术的基本原理及其在提高程序性能方面的应用,还掌握了实现一个完整对象池所需要的关键技术和类。这为开发高效、稳定的Java应用程序奠定了坚实的基础。
本文将详细探讨Java对象池技术的基本原理及其具体实现方式。 #### 基本概念 在开始之前,我们先明确几个基本概念: - **对象池**:一种存储和管理对象的容器,这些对象可以被重复使用而不是每次都需要重新创建。 ...
通过对这些代码的阅读和分析,可以更深入地理解对象池的工作原理以及如何在实际项目中应用。 对象池在游戏开发、数据库连接池、线程池等领域有着广泛应用。例如,在游戏编程中,频繁创建和销毁的游戏对象(如子弹、...
通过上述分析,我们可以看出对象池技术通过预创建和复用对象来提高程序的运行效率和性能。理解并正确使用对象池不仅可以帮助我们编写出更加高效稳定的代码,还能有效优化资源管理。希望本文能够对你在实际项目中运用...
本文将深入探讨如何使用Dictionary来实现一个简单的对象池,并分析其工作原理、优缺点以及适用场景。 首先,我们来理解一下`Dictionary`在对象池中的角色。在C#中,`Dictionary, TValue>`是泛型类,它提供了一个...
在编程领域,尤其是在性能敏感的系统中,对象池是一种优化技术,用于管理和重用对象,以减少频繁创建和销毁对象带来的开销。本课件主要围绕C#中的对象池进行讲解,旨在帮助开发者理解并掌握这一高效编程策略。 C#的...
在软件开发中,对象池是一种优化资源管理的技术,它通过预先创建并维护一组对象,避免频繁地创建和销毁对象,从而提高系统的性能。本文将探讨对象池的设计原理、实现方式以及它在实际应用中的价值。 1. **对象池的...
SSM 框架原理分析 SSM 框架是当前 Java Web 开发中最流行的框架之一,它是由 Spring、SpringMVC 和 MyBatis 三个框架组成的。下面我们将对 SSM 框架的三个原理进行分析。 一、Spring 框架原理 Spring 框架是 SSM ...
4. **对象池策略(Pooling Strategy)**:定义了连接的分配和回收规则,例如线程局部连接、公平分配、LRU(Least Recently Used)等策略。 5. **池化连接(Pooled Connection)**:是连接池中的实际对象,它是一个...
数据库原理与应用是计算机科学中的核心课程,它涵盖了数据存储、检索、管理和更新的基本理论与实践。本课件集合了《数据库系统及应用》(第二版)的主要内容,旨在帮助学习者深入理解数据库的工作机制,并掌握实际...
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才...对于new和delete,malloc和free的源码进行阅读,对于创建对象需要多次创建和释放的的情况实现一个对象池 实现的方案使用Queue进行创建
在数据库连接管理场景下,连接池技术正好符合这一模式的要求。 **连接池的基本思想**:建立一个包含一定数量预先创建好的数据库连接的缓冲池。应用程序在需要数据库连接时,可以从这个缓冲池中获取一个现有的连接,...
数据库原理与应用是计算机科学中的一个关键领域,它涉及到数据的组织、存储、检索和管理。在本资源中,我们关注的是与基础理论、开发技术和实践相关的源代码,特别是使用C#编程语言实现的部分。C#是一种现代、面向...
BoneCP是一款高效、轻量级的Java数据库连接池实现,它的源码分析对于我们理解数据库连接池的工作原理,优化数据库性能以及进行二次开发具有重要意义。 首先,我们需要了解数据库连接池的基本概念。数据库连接池是...
电化学工作站的基本原理是基于电化学反应的原理,通过检测电池的电压、电流、容量等基本参数,来了解电池的反应机理,并通过交流阻抗参数来检测电池的反应机理。 电化学工作站的应用 电化学工作站的应用非常广泛,...
《Lucene原理与代码分析》深入探讨了几乎最新版本的Lucene的工作机制和代码实现细节,为理解全文搜索引擎的核心技术提供了宝贵的资源。以下是对该文件关键知识点的详细解析: ### 全文检索的基本原理 #### 总论 ...
总之,数据库系统原理及应用涉及到的内容广泛且深入,从基础理论到实际操作,从设计到优化,都需要扎实的理解和实践。苗雪兰教授的教程通过PPT形式,应会以直观易懂的方式讲解这些知识点,帮助学习者全面掌握数据库...
《数据库技术及应用》课程是IT领域中至关重要的一门学科,它涵盖了数据库的基本原理、SQL Server的实际运用以及VB.NET编程语言在数据库管理中的接口开发。本教学资源包旨在为学习者提供一个全面、深入理解数据库技术...
本资源"ObjPool.h"可能是一个实现了C++对象内存池的头文件,由"C++侦探改写",可能是对原内存池实现的分析和改进。下面我们将深入探讨C++对象内存池的原理、设计以及可能的优化策略。 内存池的基本思想是预先分配一...