一个简单的对象池设计

简介:
1.  对象池

当调用对象时,不使用常规的 new  构造子的方式,而是通过一个对象池操作。即如果池中存在该对象,则取出;如果不存在,则新建一个对象并存储在池中。当使用完该对象后,则将该对象的归还给对象池。
这里会存在几个问题,必须注意。
Tips 1 ,考虑多线程状态下的存取对象;
Tips 2 ,考虑将对象池目录表设计为 Singleton 模式,这样使得内存中仅存在唯一的一份缓存对象的表。
2. 对象单元设计

每个对象单元指定一种类型的对象,由 Class<T>  type 维护。对象单元有两个 List List<T>  items 用于存放该类型的同类对象, List<Boolean>  checkedOut 用于指定当前是否可用。
设置信号量 int   semaphore ,当 semaphore  <  items .size() 说明目前 List 中还有“空闲”的对象。每次取出对象后需 semaphore ++ ,归还对象后需 semaphore --
对象单元 ObjectUnit.java

import  java.util.ArrayList;

import  java.util.List;

 

public   class  ObjectUnit<T> {

     private  Class<T>  type ;

     private  List<T>  items  =  new  ArrayList<T>();

     private  List<Boolean>  checkedOut  =  new  ArrayList<Boolean>();

     private   int   semaphore ;

 

     public  ObjectUnit(Class<T> type) {

        this . type  = type;

    }

 

     public   synchronized  T addItem() {

       T obj;

        try  {

           obj =  type .newInstance();

        catch  (Exception e) {

            throw   new  RuntimeException(e);

       }

        items .add(obj);

        checkedOut .add( false );

        return  obj;

    }

 

     public   synchronized  T checkOut() {

        if  ( semaphore  <  items .size()) {

            semaphore ++;

            return  getItem();

        else

            return  addItem();

    }

 

     public   synchronized   void  checkIn(T x) {

        if  (releaseItem(x))

            semaphore --;

    }

 

     private   synchronized  T getItem() {

        for  ( int  index = 0; index <  checkedOut .size(); index++)

            if  (! checkedOut .get(index)) {

               checkedOut .set(index,  true );

               return   items .get(index);

           }

        return   null ;

    }

 

     private   synchronized   boolean  releaseItem(T item) {

        int  index =  items .indexOf(item);

        if  (index == -1)

            return   false // Not in the list

        if  ( checkedOut .get(index)) {

            checkedOut .set(index,  false );

            return   true ;

       }

        return   false ;

    }

}
3. 对象池目录表设计

使用 Map<Class<?>, ObjectUnit<?>> 来保存当前对象池中类型目录,并把它设计为线程安全的 ConcurrentHashMap
这里的 getObj 方法和 renObj 方法不用加锁,因为它调用的对象单元类是线程安全的,并且 Map 是线程安全的。
此外,这里在处理泛型的时候,会有 warning 产生,因为之前定义 Map 中使用 <?> ,而后面的两个泛型方法指定 <T> 。还没有想到更好的解决办法。
Provider.java

import  java.util.Map;

import  java.util.concurrent.ConcurrentHashMap;

 

public   class  Provider {

     private  Map<Class<?>, ObjectUnit<?>>  providers  =  new  ConcurrentHashMap<Class<?>, ObjectUnit<?>>();

     private   static  Provider  instance  =  new  Provider();

 

     private  Provider() {

    }

 

     public   static  Provider getInstance() {

        return   instance ;

    }

 

     @SuppressWarnings ( "unchecked" )

     public  <T> T getObj(Class<T> key) {

       ObjectUnit value =  providers .get(key);

         if  (value !=  null ) {

            return  (T) value.checkOut();

        else  {

           value =  new  ObjectUnit<T>(key);

            providers .put(key, value);

            return  (T) value.addItem();

        }

    }

 

     @SuppressWarnings ( "unchecked" )

     public  <T>  void  renObj(T x) {

        if  ( providers .containsKey(x.getClass())) {

           ObjectUnit value =  providers .get(x.getClass());

           value.checkIn(x);

       }

    }

}
 

本文转自zhangjunhd51CTO博客,原文链接:http://blog.51cto.com/zhangjunhd/66059,如需转载请自行联系原作者
相关文章
|
7月前
|
存储 安全 算法
深入剖析JVM内存管理与对象创建原理
JVM内存管理,JVM运行时区域,直接内存,对象创建原理。
106 2
|
6月前
|
设计模式 缓存 Java
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
|
6月前
|
监控 算法 Java
掌握Java内存管理:对象生命周期与垃圾回收机制
本文旨在为读者提供一次深入的探索之旅,穿越Java虚拟机(JVM)的迷宫,揭示对象从诞生到消亡的奥秘。我们将一起揭开内存分配、存活判定以及回收策略等概念背后的神秘面纱,通过案例分析与实践技巧,让读者能够更加高效地运用Java语言,优化程序性能。
|
7月前
|
安全 Java 数据库连接
C# | 对象池
当我们在做软件开发时经常会需要创建很多的相同且特殊的对象,比如线程、内存、数据库连接、文件句柄等,这类特殊对象有着占用IO资源、创建或销毁的开销大等特点,会导致系统的性能下降和资源浪费。而对象池的出现就是为了解决此类问题,使用对象池来管理这些对象让它们可以被重复使用,从而提高效率。
84 0
|
Java C# 图形学
Unity——对象池
Unity——对象池
109 0
|
Java 测试技术
Netty4底层用对象池和不用对象池实践优化
Netty4底层用对象池和不用对象池实践优化
49 0
|
安全 编译器 程序员
25 C++ - 动态对象创建
25 C++ - 动态对象创建
46 0
|
设计模式 缓存 Java
JAVA设计模式12:享元模式,避免创建大量相似对象的开销
JAVA设计模式12:享元模式,避免创建大量相似对象的开销
|
设计模式 算法 Java
设计模式之对象池模式
设计模式之对象池模式
68 0
|
C# 图形学
U3D客户端框架之基于类对象池的可回收变量代码实现
可回收变量 是基于引用计数去做的管理,基类实现了引用计数增加,和释放功能,当调用引用计数增加函数时,引用计数+1;当调用释放函数时候,引用计数-1,当引用计数==0的时候,类对象池会把该可回收变量对象回收。