`
yuank1987
  • 浏览: 2059 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

简单的对象池管理

阅读更多
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);
       }
    }
}


本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/66059
分享到:
评论

相关推荐

    Unity 工具类 之 简单的对象池管理类 ObjectPoolManager 实现

    Unity 工具类 之 简单的对象池管理类 ObjectPoolManager 实现 1、单例类,保证整个场景中只有一个类管理对象池; 2、把需要的对象以对象池形式管理起来,需要的时候 拿出来显示即可,不需要的时候隐藏以来即可; ...

    对象池管理类

    Unity中对象池一般都是关闭和再打开的原理,鉴于有的程序员写的对象池非常复杂且不易理解,...所以我这里自己整理了一个对象池管理类,只有两个脚本即可以实现所有gameObject通用,里边还有《示例场景》,非常容易理解。

    UE4 Actor对象池插件

    在游戏开发领域,Unreal Engine 4(UE4)是一个广泛应用的高级游戏引擎,它提供了丰富的功能和工具来创建高质量的3D游戏和...通过合理的对象池管理,开发者可以显著提升游戏的流畅性和响应速度,提供更好的用户体验。

    工厂设计模式附加对象池说明

    对象池是一种资源管理技术,用于预先创建一组对象并存储在一个“池”中,当需要对象时,可以从池中获取,而不是每次需要时都创建新的对象。这样可以显著减少对象的创建和销毁开销,尤其是在创建对象成本高或者系统...

    deePool高效的JavaScript对象池

    DeePool 是一个专为JavaScript设计的对象池管理库,它的主要目的是优化内存分配和提高程序运行效率。对象池的基本思想是预先创建一组对象,当需要使用对象时,从池中获取,不再使用时则归还到池中,而不是立即销毁。...

    对象池简单Demo(资源包)

    对象池在计算机科学,尤其是游戏开发领域,是一个重要的设计模式,它主要应用于管理频繁创建和销毁的对象,以提高性能和优化资源使用。Unity引擎中,对象池被广泛应用于游戏对象的生命周期管理,如敌人、子弹或者...

    基于Java的对象池管理系统.zip

    基于Java的对象池管理系统 项目简介 本项目是一个基于Java的对象池管理系统,旨在通过对象池技术减少频繁创建和销毁对象所带来的开销,从而提高系统性能和资源利用率。对象池技术允许在需要时从池中获取已存在的...

    高效的,固定大小的对象池

    在计算机科学和编程领域,对象池是一种内存管理策略,它预先创建并维护一组对象,以供重复使用,而不是每次需要时都创建新对象。这种方式可以显著提高程序性能,特别是对于那些生命周期短暂但创建成本较高的对象。...

    Unity3D GameObject对象通用的对象池,可以管理任意多个GameObject对象,支持延迟释放

    Unity3D GameObject对象通用的对象池。可以管理任意多个GameObject对象。支持延迟释放。可以设置缓存对象的最大数量。设置对象ID,通过ID快速查找对象。也可以通过派生接口,自动释放。

    C#自定义对象池

    以下是一个简单的对象池实现框架: ```csharp public class ObjectPool&lt;T&gt; where T : class, new() { private Queue&lt;T&gt; _objectQueue; private int _maxPoolSize; public ObjectPool(int maxPoolSize) { _...

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

    - **对象的生命周期管理**:合理设定对象池的大小,避免无限制地增加池中对象的数量导致内存泄漏。 通过以上内容的详细介绍,我们不仅了解了Java对象池技术的基本原理及其在提高程序性能方面的应用,还掌握了实现一...

    对象池管理器(项目中中剥离出的)

    对象池管理器是一种在软件开发中常见的优化技术,特别是在资源密集型或性能敏感的应用中,如游戏引擎、数据库连接管理等。对象池的基本思想是预先创建一组对象并将其存储在一个集合中,当需要使用对象时,可以从池中...

    对象池

    在Java编程中,对象池通常用于管理那些创建和销毁成本较高的对象,通过复用已存在的对象来避免频繁的实例化操作。这个压缩包包含三个文件:`ObjectPool.java`、`Test.java`和`TestObject.java`,分别代表了对象池的...

    unity子弹对象池详细注释

    在Unity游戏开发中,对象池是一种优化资源管理的技术,它能有效地减少对象的频繁创建与销毁,从而提高游戏性能。本教程将详细讲解基于Unity的子弹对象池实现,以及如何通过注释理解并扩展其功能。 一、对象池概念 ...

    C++对象池源码示例

    对象池是一种优化资源管理的技术,特别是在频繁创建和销毁对象的场景下。本篇将深入探讨对象池的概念、工作原理以及如何在C++中实现对象池。 对象池的基本思想是预先创建并维护一组对象,而不是每当需要时就动态地...

    Java对象池实现源码

    下面是一个简单的Java对象池实现,以`ObjectPool`类为例: ```java import java.util.ArrayList; import java.util.List; public class ObjectPool&lt;T&gt; { private List&lt;T&gt; pool; private ObjectFactory&lt;T&gt; ...

    用Dictionary写的对象池

    本文将深入探讨如何使用Dictionary来实现一个简单的对象池,并分析其工作原理、优缺点以及适用场景。 首先,我们来理解一下`Dictionary`在对象池中的角色。在C#中,`Dictionary, TValue&gt;`是泛型类,它提供了一个...

    unity对象池的案例Demo

    对象池的主要目标是管理游戏中的短期和中期生存的对象,例如子弹、敌人或者粒子效果。当这些对象不再需要时,它们不是被销毁,而是被放回池中待用,这样下次需要时就可以直接复用,而不是重新创建。 在Unity中实现...

    万能对象池【C#实现】

    在编程领域,对象池是一种设计模式,用于管理对象的创建和销毁,以提高程序性能,尤其是在频繁创建和销毁对象的场景下。本文将详细讲解如何使用C#语言实现一个通用的对象池,以及它背后的原理和优势。 首先,理解...

    关于java对象池的例子代码

    下面是一个简单的Java对象池实现示例: ```java import java.util.Stack; public class ObjectPool&lt;T&gt; { private Stack&lt;T&gt; pool = new Stack(); public ObjectPool(int initialSize, Supplier&lt;T&gt; creator) { ...

Global site tag (gtag.js) - Google Analytics