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 实现 1、单例类,保证整个场景中只有一个类管理对象池; 2、把需要的对象以对象池形式管理起来,需要的时候 拿出来显示即可,不需要的时候隐藏以来即可; ...
Unity中对象池一般都是关闭和再打开的原理,鉴于有的程序员写的对象池非常复杂且不易理解,...所以我这里自己整理了一个对象池管理类,只有两个脚本即可以实现所有gameObject通用,里边还有《示例场景》,非常容易理解。
对象池分级管理,可以创建对象池,缓存池,缓式加载。
冷热分离: 运行时内存实时预览 编辑模式下可以更轻松的配置初始化预加载的内容 ...支持 常规对象池管理 支持 自动动态扩展 Document: https://blog.csdn.net/qq_39162566/article/details/129259017
利用接口特性构建可自动回收的Query对象池 构建一个线程池,外部通过指定接口调用线程中的Query处理数据库操作,当外部使用完成后,依据接口生存期自管理的特性释放外部的引用; 特性: 1. 线程内查询,外部调用...
使用对象池,减少new和delete的次数,提供运行效率,减少内存碎片,统一管理内存,防止new和delete用得不当导致内存泄露,对应的博客链接:http://blog.csdn.net/d704791892/article/details/40486261
Delphi多线程DB组件接口特性创建可自动回收的Query对象池,通过指定接口调用线程中的Query处理数据库操作,当请求结束后自动释放外部引用; 简要说明: TParamItem 管理存储过程的参数; ...
Unity3D GameObject对象通用的对象池。可以管理任意多个GameObject对象。支持延迟释放。可以设置缓存对象的最大数量。设置对象ID,通过ID快速查找对象。也可以通过派生接口,自动释放。
PoolManager是Unity的原始和最佳对象池解决方案,它可以更有效地管理实例,以提高性能,组织场景层次结构,并且易于实现。
lifeguard对象池管理器API文档示例池发出包装在smartpointer中的值。 外部板条箱救生员; 使用救生员:: *; lifeguard对象池管理器API文档示例池发出包装在smartpointer中的拥有值。 外部板条箱救生员; 使用救生员::...
untiy3D的对象池管理插件,最新版V7.0。功能强大!
ObjectPooling V2-Unity对象池工具插件 经过一些重要的改进,ObjectPooling系统发布给公众使用!以下是其特点:生成和管理游戏对象,检索方法包括数组ID、prefab名称和直接prefab比较。 此外,每当加载新场景时,池...
对象池通过对象复用的方式来避免重复创建对象,它会事先创建一定数量的对象放到池中,当用户需要创建对象的时候,直接从对象池中获取即可,用完对象之后再放回到对象池中,以便复用。这种方式避免了重复创建耗时或耗...
基于OCI和对象池技术的跨平台Oracle数据源管理中间件的实现.pdf
PoolSharp是一个简单,轻量,线程安全的对象池。 它还支持一次性类型的合并,管理合并对象的生存时间并在可能的情况下进行早期处理。 池实现实现了一个简单的通用接口,因此可以对其进行模拟或替换。支持平台现在; ...
专业池管理 独立的场景池 高级的预加载 智能生成系统 定制检查清理 容易学习。直观的设计 ......
分享一款unity的插件 用来建立对象实例化池子管理的工具
unity资源池管理插件PoolManager v7.0.1.unitypackage
因此,从池中删除对象时,在将对象放回之前,该对象在池中不可用。 组对象具有生命周期: 创建验证销毁。 顺序图 优势 提供显着的性能提升。 管理您的连接,并提供一种重用和共享它们的方式。 当类的实例的初始化...
socket对象连接池实例,使用GenericObjectPool对象池。