对象池----Java实现
来源:互联网 发布:金融支付 数据挖掘 编辑:程序博客网 时间:2024/05/18 00:38
我这个对象池完成功能:
1、创建一个固定大小的对象池,也就是说不允许在对象池创建以后进行容量更改。
2、客户端可以从对象池获取一个可用对象
3、客户端可以把对象交还给对象池,然后可以被其他的客户端再次使用
4、可以完成对象池的创建和销毁
有几条编程准备以注释的形式出现。
下面是我的代码:
import java.util.Enumeration;import java.util.Vector;public class ObjectPool { // 对象池中存放的类型 // 遵循nested class和top-level class的使用情况 // 这个类只在ObjectPool内部使用,所以最好定义成嵌套类 private static class PooledObject { private Object object = null;// 对象 private boolean used = false;// 是否有外部客户端正在使用,默认是没有 // 构造函数,根据一个 Object 构告一个 PooledObject 对象 public PooledObject(Object object) { this.object = object; } public Object getObject() { return object; } public boolean isUsed() { return used; } public void setUsed(boolean used) { this.used = used; } } // 由于也只能有一个对象池,所以也要使用单例模式 // 在这里使用饿汉模式 private static ObjectPool instance = new ObjectPool(); private ObjectPool() { } // 得到对象池的一个单例 public static ObjectPool getInstance() { return instance; } private static int maxNumOfObject = 50;// 对象池的最大数量 private static Vector objects = null;// 存放对象池中对象的可变向量 // 创建一个对象池 public synchronized void createPool() { if (objects != null) { return; } objects = new Vector(); for (int i = 0; i < maxNumOfObject; i++) { Object obj = new Object(); objects.addElement(new PooledObject(obj)); } } // 返回对象池中可用的对象 public synchronized Object getUseableObject() { // 如果对象池没有创建起来,则是不可能有对象存在的 if (null == objects) { return null; } Object conn = getUsableObject(); // 获得一个可用的对象 return conn; } // 返回一个可用对象 private Object getUsableObject() { // 从对象池中获得一个可用的对象 Object obj = findUsableObject(); // 没有寻找到可用对象 if (null == obj) { return null; } return obj; } // 找到一个可用对象 private Object findUsableObject() { Object obj = null; PooledObject pObj = null; // 获得对象池向量中所有的对象 Enumeration enumerate = objects.elements(); // 遍历所有的对象,看是否有可用的对象 while (enumerate.hasMoreElements()) { pObj = (PooledObject) enumerate.nextElement(); // 如果此对象不忙,则获得它的对象并把它设为忙 if (!pObj.isUsed()) { obj = pObj.getObject(); pObj.setUsed(true); } } return obj;// 返回找到到的可用对象 } // 返回一个对象到对象池,并且标记这个对象可用 // 也就是是说外部不再使用这个对象了,对象池要回收了,以供其他客户端使用 public void returnObject(Object obj) { if (null == obj) { return; } PooledObject pObj = null; Enumeration enumerate = objects.elements(); // 遍历对象池中的所有对象,找到这个要返回的对象对象 while (enumerate.hasMoreElements()) { pObj = (PooledObject) enumerate.nextElement(); // 先找到对象池中的要返回的对象对象 if (obj == pObj.getObject()) { // 找到了 , 设置此对象为空闲状态 pObj.setUsed(false); break; } } } // 关闭对象池,同时清空池中所有对象 public synchronized void closeObjectPool() { // 确保对象池存在,如果不存在,返回 if (objects == null) { return; } PooledObject pObj = null; Enumeration enumerate = objects.elements(); while (enumerate.hasMoreElements()) { // 遍历得到对象池中的对象 // 从对象池向量中删除它 pObj = (PooledObject) enumerate.nextElement(); objects.removeElement(pObj); } // 置对象池为空 objects = null; }}
下面是测试代码:
public class Main { public static void main(String[] args) { // 得到对象池 ObjectPool objPool = ObjectPool.getInstance(); // 在对象池中初始化50个对象,并且都设置为可用状态 objPool.createPool(); // 从对象池中拿出一个可用对象 Object obj = objPool.getUseableObject(); // 打印一下这个对象的hashCode System.out.println("obj===" + obj.toString()); // 把这个对象还回去 objPool.returnObject(obj); // 从对象池中拿出一个可用对象 Object obj1 = objPool.getUseableObject(); // 打印一下这个对象的hashCode System.out.println("obj1===" + obj1.toString()); // 销毁对象池以及所有对象 objPool.closeObjectPool(); }}
下面是我打印输出:
obj===java.lang.Object@55e55fobj1===java.lang.Object@55e55f
结论:我们从对象池获得一个对象,然后还回去,然后再借一个,发现这两个对象是同一个。这就表明对象池编写没有问题。
但是,如果需要增加对象池的大小呢?
1 0
- java实现对象池
- 对象池----Java实现
- 翻译:java实现对象池
- Java对象池技术原理及其实现
- Java对象池的简单实现
- java排序对象实现
- java 实现对象克隆
- java实现对象排序
- java实现对象排序
- java 实现对象的克隆
- java 实现串行化对象
- java实现对象的排序
- java实现对象的排序
- java对象实现Serializable接口
- JAVA 对象深度复制实现
- java 实现对象的clone
- java反射实现对象复制
- Java对象池技术的原理及其实现 --Java对象的生命周期分析
- tomcat内存设置
- arcgis中如何使用查询构建器筛选数据
- 【caffe-Windows】caffe+VS2013+Windows无GPU快速配置教程
- ECMAScript6快速入手攻略
- js处理层级数据结构的一些总结
- 对象池----Java实现
- H5 Canvas的事件处理初学!
- JVM之类文件结构——上篇(常量池)
- eclipse 快捷键
- 组装机电源线的开机线、重启线、电源指示灯、硬盘指示灯线怎么接主板
- android之RxJava的学习,从浅到深,从入门到别放弃(一)
- Codeforces Round #277.5(Div. 2) F. Special Matrices【思维+Dp】好题~好题~
- 2017年4月20日工作日记
- iwebshop后台模块