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

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. ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法

    ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法 近来正在分析淘宝中商品的信息,效果发生乱码,如: 原因便是中文字符格式发生冲突,ASP.NET MVC 默认采用utf-8,可是淘宝网页采用g ...

  2. python中的getattr函数

    getattr(object, name[, default]) -> value Get a named attribute from an object; getattr(x, 'y') i ...

  3. HDU 3491 最小点权割集

    题意:有n个城市,m条双向边,有一群小偷从s前往t偷东西,警察叔叔们想要逮捕小偷们,现在告诉你在每座城市需要多少警察才能抓住这个城市的小偷,为什么说这个城市,因为小偷们会分开跑:然后题目还说不能在s和 ...

  4. Unity 2D Touch Movement

    Demo试玩(Kongregate既然也有广告时间了 --!)http://www.kongregate.com/games/zhaoqingqing/2d-touch-movement 操作步骤 1 ...

  5. Linux 安装oracle客户端

    环境: CentOS release 6.4 (Final) 一.下载文件 1.首先要查看oracle版本,对应的SQL如下:  select * from V$version ; 2.根据oracl ...

  6. QTP 10 安装及破解

    QTP(QuickTest Professional),是一款比较优秀的商业自动化测试工具,主要用于web项目和C/S结构程序的测试. QTP具有的一大特性:关键字驱动测试(keyword-drive ...

  7. MongoDB学习(一)简介

    本篇主要简单介绍一下MongoDB数据库. 一.简介 mongoDB是一个开源的,基于分布式的,面向文档存储的非关系型数据库.是非关系型数据库当中功能最丰富.最像关系数据库的. mongoDB由C++ ...

  8. createElement创建标签及appendChild添加到元素的后面

    var p = document.createElement('p'); var box = document.getElementsByTagName('div')[0]; box.appendCh ...

  9. ASP.NET MVC 扩展数据验证 转

    此文只作记录 public class MaxWordsAttribute : ValidationAttribute { public MaxWordsAttribute(int maxWords) ...

  10. 07SpringMvc_jsp到jsp的控制器_ParameterizableViewController

    本文主要讲的是控制器,Action继承什么类.记得Springmvc系列的第一篇文章说过.SpirngMVC的实现流程.