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

上传人:da****ge 文档编号:243077204 上传时间:2024-09-15 格式:PPTX 页数:16 大小:105.97KB
返回 下载 相关 举报
Java对象池技术的原理及其实现_第1页
第1页 / 共16页
Java对象池技术的原理及其实现_第2页
第2页 / 共16页
Java对象池技术的原理及其实现_第3页
第3页 / 共16页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,5/23/2016,#,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)&,this,.objects.size() ,this,.maxObjects) Object obj =,new,Obj(); 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(); ,总结:,恰当地使用对象池技术,能有效地改善应用程序的性能。目前,对象池技术已得到广泛的应用,如对于网络和数据库连接这类重量级的对象,一般都会采用对象池技术。但在使用对象池技术时也要注意如下问题:,并非任何情况下都适合采用对象池技术。基本上,只在重复生成某种对象的操作成为影响性能的关键因素的时候,才适合采用对象池技术。而如果进行池化所能带来的性能提高并不重要的话,还是不采用对象池化技术为佳,以保持代码的简明。,要根据具体情况正确选择对象池的实现方式。如果是创建一个公用的对象池技术实现包,或需要在程序中动态指定所池化对象的,Class,类型时,才选择通用对象池。而大部分情况下,采用专用对象池就可以了。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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