Java对象池技术的原理及其实现.pptx

上传人:wuy****n92 文档编号:70799224 上传时间:2023-01-28 格式:PPTX 页数:16 大小:229.19KB
返回 下载 相关 举报
Java对象池技术的原理及其实现.pptx_第1页
第1页 / 共16页
Java对象池技术的原理及其实现.pptx_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《Java对象池技术的原理及其实现.pptx》由会员分享,可在线阅读,更多相关《Java对象池技术的原理及其实现.pptx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Java对象池技术的原理及其实对象池技术的原理及其实现现何为对象池?对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存储某个实例数受限的类的实例,每一个实例还要加一个标记,标记该实例是否被占用。当类初始化的时候,这个对象池就被初始化了,实例就被创建出来。然后,用户可以向这个类索取实例,如果池中所有的实例都已经被占用了,那么抛出异常。用户用完以后,还要把实例“还”回来,即释放占用。为何使用对象池?当一个对象频繁使用时,会频繁的创建并会消耗系统很大的性能,对象池技术就能够解决这个问题.使用对象池的思路将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,

2、从而在一定程度上减少频繁创建对象所造成的开销。并非所有对象都适合拿来池化因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。但是对于生成时开销可观的对象,池化技术就是提高性能的有效策略了。基本原理对象池技术基本原理的核心有两点:缓存和共享,即对于那些被频繁使用的对象,在使用完后,不立即将它们释放,而是将它们缓存起来,以供后续的应用程序重复使用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。事实上,由于对象池技术将对象限制在一定的数量,也有效地减少了应用程序内存上的开销。实现一个对象池,一般

3、会涉及到如下的类:1)对象池工厂()对象池工厂(ObjectPoolFactory)类)类该类主要用于管理相同类型和设置的对象池(ObjectPool),它一般包含如下两个方法:createPool:用于创建特定类型和设置的对象池;destroyPool:用于释放指定的对象池;同时为保证ObjectPoolFactory的单一实例,可以采用Singleton设计模式,见下述getInstance方法的实现:public static ObjectPoolFactory getInstance()if(poolFactory=null)poolFactory=new ObjectPoolFact

4、ory();return poolFactory;2)参数对象()参数对象(ParameterObject)类)类该类主要用于封装所创建对象池的一些属性参数,如池中可存放对象的数目的最大值(maxCount)、最小值(minCount)等。3)对象池()对象池(ObjectPool)类)类用于管理要被池化对象的借出和归还,并通知PoolableObjectFactory完成相应的工作。它一般包含如下两个方法:getObject:用于从池中借出对象;returnObject:将池化对象返回到池中,并通知所有处于等待状态的线程;4)池化对象工厂()池化对象工厂(PoolableObjectFact

5、ory)类)类该类主要负责管理池化对象的生命周期,就简单来说,一般包括对象的创建及销毁。该类同ObjectPoolFactory一样,也可将其实现为单实例。一一个简单构建对象池的例子个简单构建对象池的例子public class ObjectPool private int numObjects=10;/对象池的大小 private int maxObjects=50;/对象池最大的大小 private Vector objects=null;/存放对象池中对象的向量(PooledObject类型)public ObjectPool()/*创建一个对象池*/public synchronize

6、d void createPool()/确保对象池没有创建。如果创建了,保存对象的向量 objects 不会为空 if(objects!=null)return;/如果己经创建,则返回 /创建保存对象的向量,初始时有 0 个元素 objects=new Vector();/根据 numObjects 中设置的值,循环创建指定数目的对象 for(int x=0;x numObjects;x+)if(objects.size()=0)&this.objects.size()this.maxObjects)Object obj=new Obj();objects.addElement(new Poo

7、ledObject(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;/返

8、回获得的可用的对象 /*本函数从对象池对象 objects 中返回一个可用的的对象,如果*当前没有可用的对象,则创建几个对象,并放入对象池中。*如果创建后,所有的对象都在使用中,则返回 null*/private Object getFreeObject()/从对象池中获得一个可用的对象 Object obj=findFreeObject();if(obj=null)createObjects(incrementalObjects);/如果目前对象池中没有可用的对象,创建一些对象/重新从池中查找是否有可用对象 obj=findFreeObject();/如果创建对象后仍获得不到可用的对象,则返

9、回 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.nextEle

10、ment();/如果此对象不忙,则获得它的对象并把它设为忙 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=ob

11、jects.elements();/遍历对象池中的所有对象,找到这个要返回的对象对象 while(enumerate.hasMoreElements()pObj=(PooledObject)enumerate.nextElement();/先找到对象池中的要返回的对象if(obj=pObj.getObject()/找到了,设置此对象为空闲状态 pObj.setBusy(false);break;/*关闭对象池中所有的对象,并清空对象池。*/public synchronized void closeObjectPool()/确保对象池存在,如果不存在,返回 if(objects=null)re

12、turn;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

13、 Thread.sleep(mSeconds);catch(InterruptedException e)/*内部使用的用于保存对象池中对象的类。*此类中有两个成员,一个是对象,另一个是指示此对象是否正在使用的标志。*/class PooledObject Object objection=null;/对象 boolean busy=false;/此对象是否正在使用的标志,默认没有正在使用/构造函数,根据一个 Object 构告一个 PooledObject 对象 public PooledObject(Object objection)this.objection=objection;/返回

14、此对象中的对象 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

15、(String args)throws Exception ObjectPool objPool=new ObjectPool();objPool.createPool();Object obj=objPool.getObject();returnObject(obj);objPool.closeObjectPool();总结:总结:恰当地使用对象池技术,能有效地改善应用程序的性能。目前,对象池技术已得到广泛的应用,如对于网络和数据库连接这类重量级的对象,一般都会采用对象池技术。但在使用对象池技术时也要注意如下问题:并非任何情况下都适合采用对象池技术。基本上,只在重复生成某种对象的操作成为影响性能的关键因素的时候,才适合采用对象池技术。而如果进行池化所能带来的性能提高并不重要的话,还是不采用对象池化技术为佳,以保持代码的简明。要根据具体情况正确选择对象池的实现方式。如果是创建一个公用的对象池技术实现包,或需要在程序中动态指定所池化对象的Class类型时,才选择通用对象池。而大部分情况下,采用专用对象池就可以了。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁