Java对象池技术的原理及其实现.pptx_第1页
Java对象池技术的原理及其实现.pptx_第2页
Java对象池技术的原理及其实现.pptx_第3页
Java对象池技术的原理及其实现.pptx_第4页
Java对象池技术的原理及其实现.pptx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java对象池技术的原理及其实 现 何为对象池? 对象池类就像是一个对象管理员,它以Static列表( 也就是装对象的池子)的形式存储某个实例数受限的 类的实例,每一个实例还要加一个标记,标记该实例 是否被占用。当类初始化的时候,这个对象池就被初 始化了,实例就被创建出来。然后,用户可以向这个 类索取实例,如果池中所有的实例都已经被占用了, 那么抛出异常。用户用完以后,还要把实例“还”回来 ,即释放占用。 为何使用对象池? 当一个对象频繁使用时,会频繁的创建并会消耗系统 很大的性能,对象池技术就能够解决这个问题. 使用对象池的思路 将用过的对象保存起来,等下一次需要这种对象的时 候,再拿出来重复使用,从而在一定程度上减少频繁 创建对象所造成的开销。 并非所有对象都适合拿来池 化因为维护对象池也要造成一定开销。对生成时开 销不大的对象进行池化,反而可能会出现“维护对象 池的开销”大于“生成新对象的开销”,从而使性能 降低的情况。但是对于生成时开销可观的对象,池化 技术就是提高性能的有效策略了。 基本原理 对象池技术基本原理的核心有两点:缓存和共享,即 对于那些被频繁使用的对象,在使用完后,不立即将 它们释放,而是将它们缓存起来,以供后续的应用程 序重复使用,从而减少创建对象和释放对象的次数, 进而改善应用程序的性能。事实上,由于对象池技术 将对象限制在一定的数量,也有效地减少了应用程序 内存上的开销。 实现一个对象池,一般会涉及到如下的类: 1)对象池工厂(ObjectPoolFactory)类 该类主要用于管理相同类型和设置的对象池(ObjectPool),它一般包含如下 两个方法: createPool:用于创建特定类型和设置的对象池; destroyPool:用于释放指定的对象池; 同时为保证ObjectPoolFactory的单一实例,可以采用Singleton设计模式,见 下述getInstance方法的实现: public static ObjectPoolFactory getInstance() if (poolFactory = null) poolFactory = new ObjectPoolFactory(); return poolFactory; 2)参数对象(ParameterObject)类 该类主要用于封装所创建对象池的一些属性参数,如池中可存放对象的数目的最大值( maxCount)、最小值(minCount)等。 3)对象池(ObjectPool)类 用于管理要被池化对象的借出和归还,并通知PoolableObjectFactory完成相应的工作。它一般 包含如下两个方法: getObject:用于从池中借出对象; returnObject:将池化对象返回到池中,并通知所有处于等待状态的线程; 4)池化对象工厂(PoolableObjectFactory)类 该类主要负责管理池化对象的生命周期,就简单来说,一般包括对象的创建及销毁。该类同 ObjectPoolFactory一样,也可将其实现为单实例。 一个简单构建对象池的例子 public class ObjectPool private int numObjects = 10; / 对象池的大小 private int maxObjects = 50; / 对象池最大的大小 private Vector objects = null; /存放对象池中对象的向量( PooledObject类型) public ObjectPool() /* 创建一个对象池*/ public synchronized void createPool() / 确保对象池没有创建。如果创建了,保存对象的向量 objects 不会为空 if (objects != null) return; / 如果己经创建,则返回 / 创建保存对象的向量 , 初始时有 0 个元素 objects = new Vector(); / 根据 numObjects 中设置的值,循环创建指定数目的对象 for (int x = 0; x numObjects; x+) if (objects.size() = 0) objects.addElement(new PooledObject(obj); public synchronized Object getObject() / 确保对象池己被创建 if (objects = null) return null; / 对象池还没创建,则返回 null Object conn = getFreeObject(); / 获得一个可用的对象 / 如果目前没有可以使用的对象,即所有的对象都在使用中 while (conn = null) wait(250); conn = getFreeObject(); / 重新再试,直到获得可用的对象,如果 / getFreeObject() 返回的为 null,则表明创建一批对象后也不可获得可用对象 return conn;/ 返回获得的可用的对象 /* * 本函数从对象池对象 objects 中返回一个可用的的对象,如果 * 当前没有可用的对象,则创建几个对象,并放入对象池中。 * 如果创建后,所有的对象都在使用中,则返回 null */ private Object getFreeObject() / 从对象池中获得一个可用的对象 Object obj = findFreeObject(); if (obj = null) createObjects(incrementalObjects); /如果目前对象池中没有可用的对象,创建一些对象 / 重新从池中查找是否有可用对象 obj = findFreeObject(); / 如果创建对象后仍获得不到可用的对象,则返回 null if (obj = null) return null; return obj; /* * 查找对象池中所有的对象,查找一个可用的对象, * 如果没有可用的对象,返回 null */ private Object findFreeObject() Object obj = null; PooledObject pObj = null; / 获得对象池向量中所有的对象 Enumeration enumerate = objects.elements(); / 遍历所有的对象,看是否有可用的对象 while (enumerate.hasMoreElements() pObj = (PooledObject) enumerate.nextElement(); / 如果此对象不忙,则获得它的对象并把它设为忙 if (!pObj.isBusy() obj = pObj.getObject(); pObj.setBusy(true); return obj;/ 返回找到到的可用对象 /* * 此函数返回一个对象到对象池中,并把此对象置为空闲。 * 所有使用对象池获得的对象均应在不使用此对象时返回它。 */ public void returnObject(Object obj) / 确保对象池存在,如果对象没有创建(不存在),直接返回 if (objects = null) return; PooledObject pObj = null; Enumeration enumerate = objects.elements(); / 遍历对象池中的所有对象,找到这个要返回的对象对象 while (enumerate.hasMoreElements() pObj = (PooledObject) enumerate.nextElement(); / 先找到对象池中的要返回的对象 if (obj = pObj.getObject() / 找到了 , 设置此对象为空闲状态 pObj.setBusy(false); break; /* * 关闭对象池中所有的对象,并清空对象池。 */ public synchronized void closeObjectPool() / 确保对象池存在,如果不存在,返回 if (objects = null) return; PooledObject pObj = null; Enumeration enumerate = objects.elements(); while (enumerate.hasMoreElements() pObj = (PooledObject) enumerate.nextElement(); / 如果忙,等 5 秒 if (pObj.isBusy() wait(5000); / 等 5 秒 / 从对象池向量中删除它 objects.removeElement(pObj); / 置对象池为空 objects = null; /* * 使程序等待给定的毫秒数 */ private void wait(int mSeconds) try Thread.sleep(mSeconds); catch (InterruptedException e) /* * 内部使用的用于保存对象池中对象的类。 * 此类中有两个成员,一个是对象,另一个是指示此对象是否正在使用的标志 。 */ class PooledObject Object objection = null;/ 对象 boolean busy = false; / 此对象是否正在使用的标志,默认没有正在使用 / 构造函数,根据一个 Object 构告一个 PooledObject 对象 public PooledObject(Object objection) this.objection = objection; / 返回此对象中的对象 public Object getObject() return objection; / 设置此对象的,对象 public void setObject(Object objection) this.objection = objection; / 获得对象对象是否忙 public boolean isBusy() return busy; / 设置对象的对象正在忙 public void setBusy(boolean busy) this.busy = busy; 测试类: 代码如下: public class ObjectPoolTest public static void main(String args) throws Exception ObjectPool objPool = new ObjectPool(); objPool.createPool(); Object obj = objPool.getObject(); returnObject(obj); objPool.closeObjectPool(); 总结: 恰当地使用对象池技术,能有效地改善应用程序的性能。目前,对象池技术 已得到广泛的应用,如对于网络和数据库连接这类重量级的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论