对象池使用的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销。 并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。但是对于生成时开销可观的对象,池化技术就是提高性能的有效策略了。下面是构建对象池的一个例子:

public class ObjectPool {
private int numObjects = 10; // 对象池的大小
private int maxObjects = 50; // 对象池最大的大小
private Vector objects = null; //存放对象池中对象的向量( PooledObject类型) public ObjectPool() {
} /*** 创建一个对象池***/
public synchronized void createPool(){
// 确保对象池没有创建。如果创建了,保存对象的向量 objects 不会为空
if (objects != null) {
return; // 如果己经创建,则返回
} // 创建保存对象的向量 , 初始时有 0 个元素
objects = new Vector(); // 根据 numObjects 中设置的值,循环创建指定数目的对象
for (int x = 0; x < numObjects; x++) {
if ((objects.size() == 0)&&this.objects.size() <this.maxObjects) {
Object obj = new Obj();
objects.addElement(new PooledObject(obj));
      }
    }
} public synchronized Object getObject(){
// 确保对象池己被创建
if (objects == null) {
return null; // 对象池还没创建,则返回 null
} Object conn = getFreeObject(); // 获得一个可用的对象 // 如果目前没有可以使用的对象,即所有的对象都在使用中
while (conn == null) {
wait(250);
conn = getFreeObject(); // 重新再试,直到获得可用的对象,如果
// getFreeObject() 返回的为 null,则表明创建一批对象后也不可获得可用对象
} return conn;// 返回获得的可用的对象
} /**
* 本函数从对象池对象 objects 中返回一个可用的的对象,如果
* 当前没有可用的对象,则创建几个对象,并放入对象池中。
* 如果创建后,所有的对象都在使用中,则返回 null
*/
private Object getFreeObject(){ // 从对象池中获得一个可用的对象
Object obj = findFreeObject(); if (obj == null) {
createObjects(incrementalObjects); //如果目前对象池中没有可用的对象,创建一些对象 // 重新从池中查找是否有可用对象
obj = findFreeObject(); // 如果创建对象后仍获得不到可用的对象,则返回 null
if (obj == null) {
return null;
}
} return obj;
} /**
* 查找对象池中所有的对象,查找一个可用的对象,
* 如果没有可用的对象,返回 null
*/
private Object findFreeObject(){ Object obj = null;
PooledObject pObj = null; // 获得对象池向量中所有的对象
Enumeration enumerate = objects.elements(); // 遍历所有的对象,看是否有可用的对象
while (enumerate.hasMoreElements()) {
pObj = (PooledObject) enumerate.nextElement(); // 如果此对象不忙,则获得它的对象并把它设为忙
if (!pObj.isBusy()) {
obj = pObj.getObject();
pObj.setBusy(true);
} return obj;// 返回找到到的可用对象
} /**
* 此函数返回一个对象到对象池中,并把此对象置为空闲。
* 所有使用对象池获得的对象均应在不使用此对象时返回它。
*/ public void returnObject(Object obj) { // 确保对象池存在,如果对象没有创建(不存在),直接返回
if (objects == null) {
return;
} PooledObject pObj = null; Enumeration enumerate = objects.elements(); // 遍历对象池中的所有对象,找到这个要返回的对象对象
while (enumerate.hasMoreElements()) {
pObj = (PooledObject) enumerate.nextElement(); // 先找到对象池中的要返回的对象对象
if (obj == pObj.getObject()) {
// 找到了 , 设置此对象为空闲状态
pObj.setBusy(false);
break;
}
}
} /**
* 关闭对象池中所有的对象,并清空对象池。
*/
public synchronized void closeObjectPool() { // 确保对象池存在,如果不存在,返回
if (objects == null) {
return;
} PooledObject pObj = null; Enumeration enumerate = objects.elements(); while (enumerate.hasMoreElements()) { pObj = (PooledObject) enumerate.nextElement(); // 如果忙,等 5 秒
if (pObj.isBusy()) {
wait(5000); // 等 5 秒
} // 从对象池向量中删除它
objects.removeElement(pObj);
} // 置对象池为空
objects = null;
} /**
* 使程序等待给定的毫秒数
*/
private void wait(int mSeconds) {
try {
Thread.sleep(mSeconds);
}
catch (InterruptedException e) {
}
} /**
* 内部使用的用于保存对象池中对象的类。
* 此类中有两个成员,一个是对象,另一个是指示此对象是否正在使用的标志 。
*/
class PooledObject { Object objection = null;// 对象
boolean busy = false; // 此对象是否正在使用的标志,默认没有正在使用 // 构造函数,根据一个 Object 构告一个 PooledObject 对象
public PooledObject(Object objection) { this.objection = objection; } // 返回此对象中的对象
public Object getObject() {
return objection;
} // 设置此对象的,对象
public void setObject(Object objection) {
this.objection = objection; } // 获得对象对象是否忙
public boolean isBusy() {
return busy;
} // 设置对象的对象正在忙
public void setBusy(boolean busy) {
this.busy = busy;
}
}
} 测试类:
代码如下: public class ObjectPoolTest {
public static void main(String[] args) throws Exception {
ObjectPool objPool = new ObjectPool(); objPool.createPool();
Object obj = objPool.getObject();
returnObject(obj);
objPool.closeObjectPool();
}
}

Java-对象池的更多相关文章

  1. java对象池commons-pool-1.6详解(一)

    自己的项目中用到了 对象池 commons-pool: package com.sankuai.qcs.regulation.protocol.client; import com.dianping. ...

  2. Java对象池

    单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...

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

    看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...

  4. Java对象池示例

    单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...

  5. 大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池

    第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark ...

  6. java对象池化技术

    https://blog.csdn.net/tiane5hao/article/details/85957840 文章目录 先写一个简单通用的对象池 通过上面的通用池实现jedis连接池 连接池测试 ...

  7. Java 对象池实现

    http://blog.csdn.net/bryantd/article/details/1100019 http://www.cnblogs.com/devinzhang/archive/2012/ ...

  8. Java中的对象池技术

    java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...

  9. Java之对象池

    单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...

  10. 用Java实现一个通用并发对象池

    这篇文章里我们主要讨论下如何在Java里实现一个对象池.最近几年,Java虚拟机的性能在各方面都得到了极大的提升,因此对大多数对象而言,已经没有必要通过对象池来提高性能了.根本的原因是,创建一个新的对 ...

随机推荐

  1. 002医疗项目-主工程模块yycgproject三层构建(三大框架的整合)

    先给出项目结构图:

  2. RDLC系列之二 子报表

    本文实现简单的子报表 一.效果图

  3. 【转】【C#】SendMessage

    SendMessage是一个在user32.dll中声明的API函数,在C#中导入如下: using System.Runtime.InteropServices; [DllImport(" ...

  4. [转]hive实例讲解实现in和not in子句

    FROM : http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842855.html 目前hive不支持 in或not in 中包含查询子句的 ...

  5. U3D 扩展方法 & Dotween & tolua

    using UnityEngine; using System.Collections; using LuaInterface;//tolua 空间引用 using DG.Tweening;//DOT ...

  6. 《WCF服务编程第三版》知识点摘录

  7. JSON与JSONP

    JSON JSON:一种用于在浏览器和服务器之间交换信息的基于文本的轻量级数据格式.是JS对象的字符串表示.例如:‘{''name":"aa","age&quo ...

  8. AWS S3使用小结

    使用场景一:储存网站的图片,并能被任何人访问 1. 创建一个bucket,名字与需要绑定的域名一致. 例如,根域名是mysite.com,希望把所有图片放在pic.mysite.com下面,访问的时候 ...

  9. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  10. 深入探索Java 8 Lambda表达式

    2014年3月,Java 8发布,Lambda表达式作为一项重要的特性随之而来.或许现在你已经在使用Lambda表达式来书写简洁灵活的代码.比如,你可以使用Lambda表达式和新增的流相关的API,完 ...