`
xian0617
  • 浏览: 8125 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
文章分类
社区版块
存档分类
最新评论

Java 对象池 及其管理 自创

阅读更多

对象池的概念俺在这里就不罗嗦了,呵呵。主要是省去相同对象的频繁创建开销和回收器回收开销。

 

无依赖关系,JDK 1.5 以上的版本可以直接使用,呵呵

 

 

/**
 * @ObjectPool.java
 * @author 张光磊
 * @since  2010-3-31 下午01:41:35
 */
package cn.zgl.utils.pool;

import java.util.ArrayList;
import java.util.concurrent.Semaphore;

/**
 * @author 张光磊
 * @version 2010.03 对象池管理类
 */
public abstract  class ObjectPool<T> {
	 private ArrayList<T> pool = null;
	 private int size=0;
	 private int step=0;
	 private int currentPoolSize=0;
	 private Semaphore pass = null;
     /**
      * 初始化ObjectPool maxSize 个
      * @param maxSize
      */
     public ObjectPool(int maxSize){
 
           //初始化资源池
    	   this.size =maxSize;
           pool = new ArrayList<T>();
           for(int i=0; i<maxSize; i++){
                pool.add(createT());
           }
           currentPoolSize=maxSize;
           pass = new Semaphore(size);

     }
     /**
      * 最多初始化ObjectPool maxSize 个,默认初始化initsize 个,之后以 step递增
      * @param maxSize 最大个数
      * @param initsize 初始化个数	
      * @param step 递增个数
      */
     public ObjectPool(int maxSize,int initsize,int step){

         //初始化资源池
    	 this.size =maxSize;
    	 this.step=step;
         pool = new ArrayList<T>();
         for(int i=0; i<maxSize; i++){
        	 pool.add(createT());
         }
         currentPoolSize=maxSize;
         pass = new Semaphore(size);

     }
     /**
      * 从池中读取一个
      * @author 张光磊
      * @since  2010-3-31 下午04:21:19
      * @return T
      * @return
      * @throws InterruptedException
      */
     public T get() throws InterruptedException{

           //获取通行证,只有得到通行证后才能得到资源
           pass.acquire();
           return getSourceFromPool();

     }
     /**
      * 归还一个到池中
      * @author 张光磊
      * @since  2010-3-31 下午04:21:30
      * @return void
      * @param resource
      */
     public void put(T resource){

           //归还通行证,并归还资源
           pass.release();
           releaseSourceToPool(resource);

     }
     /**
      * 将池中的全部释放
      * @author 张光磊
      * @since  2010-3-31 下午04:21:41
      * @return void
      */
    //public void relasePool(){
    //	 for(T t:pool){
    //		 destroyT(t);
    //	 }
    //}
    //更正为   
     public void relasePool(){
    	 for(int i=0;i<size;i++){
                       pass.acquire();
    	      destroyT(getSourceFromPool());
    	 }
     }
  /**
     * 读取一个 私有
     * @author 张光磊
     * @since  2010-3-31 下午04:22:17
     * @return T
     * @return
     */
    private synchronized T getSourceFromPool() {
        if(pool.size()==0){
     	   if(currentPoolSize<size){
     		  int newT= size-currentPoolSize>step ? step: size-currentPoolSize; 
     		  for(int i=0; i<newT; i++){
                  pool.add(createT());
             }
     		 currentPoolSize+=newT;
     	   }
        }
    	return pool.remove(0);
     }
     /**
      * 释放一个 到 池中 私有
      * @author 张光磊
      * @since  2010-3-31 下午04:22:34
      * @return void
      * @param resource
      */
     private synchronized void releaseSourceToPool(T resource) {
          // System.out.println("return "+resource);
          pool.add(resource);
     } 
     
     //创建、销毁对象
   abstract T createT();
     abstract void destroyT(T t);
     // 示例:public class IntegerPool extends ObjectPool<Integer>
}

下面是一个简单的示例,呵呵

 

/**
 * @IntegerPoolExample.java
 * @author 张光磊
 * @since  2010-3-31 下午03:18:05
 */
package cn.zgl.utils.pool;

/**
 * @author 张光磊
 */
public class IntegerPoolExample extends ObjectPool<Integer>{

	/**
	 * @param maxSize
	 */
	public IntegerPoolExample(int maxSize) {
		super(maxSize);
		// TODO Auto-generated constructor stub
	}
	
	public IntegerPoolExample() {
		super(10);
	}
	/* (non-Javadoc)
	 * @see cn.zgl.utils.pool.ObjectPool#createT()
	 */
	@Override
	Integer createT() {
		return 0;
	}

	/* (non-Javadoc)
	 * @see cn.zgl.utils.pool.ObjectPool#destroyT(java.lang.Object)
	 */
	@Override
	void destroyT(Integer t) {
		t=null;
	}
}

 

 

当然 Integer 一般是不需要用池来管理的,这仅仅是一个示例,呵呵。

 

  使用示例

 

public static void main(String[] args){
		ObjectPool<Integer> pool= new IntegerPoolExample();
		try{
			for(int i=0;i<10;i++){
				//从池中取出一个
				Integer tmp=pool.get();
				System.out.println("第"+i+"次输出内容 " +tmp);
				//修改取出的这个值
				tmp=i;
				//把修改后的值访问去 这个地方只是测试测试,实际上池中对象一般要求使用前、使用后没有变化
				pool.put(tmp);
			}
			for(int i=0;i<10;i++){
				System.out.println("第"+i+"次输出内容 " +pool.get());
			}
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		finally{
			pool.relasePool();
		}

	}

 

 

 

那么,到此为止了。呵呵,大家多多指点,个人资料请勿随意转载

1
0
分享到:
评论
4 楼 xian0617 2010-04-02  
呵呵,正解。谢谢指点。

那么,怎么处理才能更好点呢?为什么非要在构造前访问呢,呵呵。释放这个方法没有好好写,呵呵,已更正
3 楼 Heis 2010-04-02  
从线程安全的角度考虑,这也不是个好的实现,构造方法和relasePool方法如果不同步,有可能会让在构造过程中的对象被访问,或者被destroy,这会造成灾难性的问题。
2 楼 xian0617 2010-04-01  
1.对象池的作用,管理经常使用,但申请、销毁耗时的对象
2.之所以把 createT  destroyT 要求重新实现,就是为了标注各种对象不同的申请和销毁方式,并不是所有的对象对用 =null来进行销毁
3.有必要申请很多的对象进行池化管理么?应该没有吧,所以ArrayList相比LinkedList重新分配的效率和申请链表操作的效率哪个高还很难说。不过用LinkedList也行,呵呵。
1 楼 Heis 2010-03-31  
有几个问题
1.这个对象池有什么用?用来做缓存?但是为什么要缓存多个相同的对象?
2.设计有问题,对象设为null了,但是对象个数并没有减少。
3.知道ArrayList是用数组实现的吗?增删操作可能会促发数组重新分配,效率不高。为什么不用LinkedList呢?

相关推荐

    java面试自创避邪宝典

    - **内存管理**:Java的垃圾收集机制、内存泄漏的识别和防止、对象生命周期等都是常见的面试话题。 - **并发编程**:线程安全、锁机制、并发工具类(如Semaphore、ExecutorService)的使用,以及Java内存模型(JMM...

    java中MVC与LookAndFeel类及自创界面(更新)

    总的来说,理解并熟练掌握Java中的MVC模式、LookAndFeel以及自创界面,对于成为一名专业的Java GUI开发者至关重要。这不仅可以帮助你构建高效且易维护的应用,还能提升用户体验,使你的软件更具吸引力。通过实践和...

    北化java作业附自编jar运行软件

    总的来说,这个"北化java作业附自编jar运行软件"是一个很好的学习材料,它涵盖了Java编程的诸多方面,并提供了一种便捷的运行方式,对于提升Java编程技能,特别是项目管理和部署实践,具有很高的参考价值。...

    美萍库存管理系统(源代码和数据库自创的哦!)

    常见的库存管理系统的开发语言有Java、C#、Python等,每种语言都有其特点和优势。同时,源代码的结构和组织方式也反映了系统的设计思想,例如是否采用了模块化、面向对象的设计原则,这对于我们理解和复用代码至关...

    java中MVC与LookAndFeel类及自创界面ExtraLAF

    在Java编程领域,MVC(Model-View-Controller)模式是一种广泛应用的设计模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种分离使得代码更加模块化,易于维护和扩展。...

    达内hibernate自创API

    在Java开发领域,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了满足特定项目需求或提高开发效率,开发者有时会创建自定义的Hibernate API。达内教育作为国内知名的IT培训...

    Java笔记桌面程序

    本项目名为"Java笔记桌面程序",它是由一个热衷于编程的开发者为解决其所在公司无法使用网络笔记客户端的问题而自创的。这个程序采用Java语言编写,充分体现了Java的跨平台特性,可以在多种操作系统上运行,包括...

    java_chat.rar_java 聊天室_java聊天室_java聊天室程序_java鑱婂ぉ_java鑱婂ぉ瀹

    "java鑱婂ぉ"和"java鑱婂ぉ瀹"可能是对Java聊天室的特定功能或者特性的描述,但这两个词汇在标准的Java术语中并不常见,可能是指开发者或发布者自创的术语,或者翻译上的差异。 Java作为一种跨平台的编程语言,因其...

    Java自己开发的一个工作流引擎例子

    然后我将Javasc代码用Java改写了,并且用mysql建了数据库表,进行了测试,可以处理一些简单的流程。我觉得代码很有学习参考价值,所以上传到这里,希望对大家有些帮助,里面附上html文件是Javascript写的工作流引擎...

    植物大战僵尸金色版(自创改版)

    自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版...

    品牌管理_自创品牌.pptx

    品牌管理_自创品牌.pptx

    自创打包工具指引

    本文将介绍一个名为“jwxtsns”的自创打包工具,用于管理并执行打包和安装操作。 首先,我们需要理解“jwxtsns”工具的基本用法。从提供的描述来看,这个工具主要服务于版本控制,如SVN,以获取最新代码。例如,你...

    java扫雷游戏,功能比较完善

    描述中提到该扫雷游戏是用Java编写的,这意味着开发者利用了Java的面向对象特性、类库以及事件处理机制来实现游戏的各种功能。Java是一种跨平台的编程语言,因此这款扫雷游戏可以在不同操作系统上运行,如Windows、...

    java GUI 山寨QQ

    【描述】"java SE综合应用 利用sql server 完成山寨QQ,希望大家多多支持"表明了该项目不仅涉及Java编程,还涵盖了数据库管理和多线程技术。开发者使用SQL Server作为后端数据库,存储用户信息、聊天记录等关键数据...

    网上书店~自创!!

    综上所述,一个自创的网上书店系统涉及到前端界面设计、后端逻辑处理、数据库管理、用户交互等多个方面,需要综合运用多种技术和方法来构建。这样的系统不仅满足了用户购书需求,也展示了开发者的技术实力和创新思维...

    浅析企业自创无形资产的管理与核算-论文.zip

    这篇论文《浅析企业自创无形资产的管理与核算》深入探讨了企业在自创无形资产过程中如何进行有效的管理和会计核算,以提升企业的经济效益。 一、无形资产概述 无形资产是指企业拥有或控制的,不具有实物形态,但能...

    java 连接数据库 lookandfeel java网络编程

    在Java编程中,"Look and Feel"是一个关键概念,它涉及到用户界面(UI)的视觉样式和交互体验。Java提供了一种机制,允许开发者改变应用程序的外观和感觉,以匹配不同的操作系统或用户的个人喜好。在提供的描述中,...

    JAVA图像去噪程序

    本项目是一个基于JAVA实现的图像去噪程序,包括了三种不同的去噪算法:均值法、中值法以及自创改进的均值法。下面将详细解释这些方法及其在实际应用中的原理。 1. **均值滤波**: 均值滤波是最基础的滤波方法之一,...

    单本JAVA电子书制作工具

    根据标签“单本JAVA电子书制作工具”,我们可以推测该软件专注于创建单一的电子书项目,而不是管理或组织多本书籍的库。 在压缩包子文件的文件名列表中,有以下几个关键文件: 1. MBookPCMark.exe:这很可能是该...

Global site tag (gtag.js) - Google Analytics