`
reallyafei
  • 浏览: 97245 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java对象池ObjectPool

    博客分类:
  • Java
阅读更多
commons-pool提供了一套很好用的对象池组件。使用也很简单,不过对一些简单的对象使用对象池就没必要了。

ObjectPool定义了一个简单的池化接口,有三个对应实现 
GenericObjectPool:实现了可配置的后进先出或先进先出(LIFO/FIFO)行为,默认是作为一个后进先出队列,这意味当对象池中有可用的空闲对象时,borrowObject 将返回最近的对象实例,如果将lifo 属性设置为false,则按FIFO行为返回对象实例。
StackObjectPool :实现了后进先出(LIFO)行为。
SoftReferenceObjectPool: 实现了后进先出(LIFO)行为。另外,对象池还在SoftReference 中保存了每个对象引用,允许垃圾收集器针对内存需要回收对象。

KeyedObjectPool定义了一个以任意的key访问对象的接口(可以池化对种对象),有两种对应实现。
GenericKeyedObjectPool :实现了先进先出(FIFO)行为。
StackKeyedObjectPool : 实现了后进先出(LIFO)行为。

PoolableObjectFactory 定义了池化对象的生命周期方法,我们可以使用它分离被池化的不同对象和管理对象的创建,持久,销毁。
BasePoolableObjectFactory这个实现PoolableObjectFactory 接口的一个抽象类,我们可用扩展它实现自己的池化工厂。

一个对象池使用的简单例子:
package tf;

import org.apache.commons.pool.BasePoolableObjectFactory;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.StackObjectPool;

public class Pool {

	public static void main(String[] args) throws Exception {
		ObjectPool pool = new StackObjectPool(new UserFactory());
		User u = (User) pool.borrowObject(); // 从池中借出一个对象
		u.setName("me");
		u.sayHello();
		pool.returnObject(u); // 归还对象
	}

	static class UserFactory extends BasePoolableObjectFactory {
		/**
		 * 产生一个新对象
		 */
		public Object makeObject() {
			return new User();
		}

		/**
		 * 还原对象状态
		 */
		public void passivateObject(Object obj) {
			User u = (User) obj;
			u.clear();
		}
	}

	static class User {
		String name;

		void setName(String name) {
			this.name = name;
		}

		void sayHello() {
			System.out.println("hello, " + name);
		}

		void clear() {
			name = "";
		}
	}
}


分享到:
评论

相关推荐

    Unity 对象池插件 Easy ObjectPool 2.0

    Unity 轻量高效对象池插件 // // 摘要: // 首次加载是否完成 public static bool firstPreloadFinish { get; } // // 摘要: // 获取实例 public static EasyObjectPool GetInstance(); // // 摘要: //...

    ObjectPool:Android 对象池

    Android 对象池 谨慎和智能地使用系统资源对 Android 来说至关重要。 过度消耗堆内存会带来OutOfMemory异常和无数次遇到垃圾收集器(GC)。 GC会占用 UI 线程的宝贵时间,并且会导致丢弃 UI 帧,从而提供糟糕的用户...

    对象池&线程池&数据库连接池

    最简单高效的JAVA对象池、线程池、以及使用对象池技术实现的数据库连接池 已在生产运行5年以上的代码 若有任何问题请与我联系

    ObjectPool:通用对象池,可用于池任何类型的资源

    对象池通用对象池,可用于池任何类型的资源。

    Unity 高效对象池管理插件 Easy ObjectPool 2.0

    冷热分离: 运行时内存实时预览 编辑模式下可以更轻松的配置初始化预加载的内容 ...支持 常规对象池管理 支持 自动动态扩展 Document: https://blog.csdn.net/qq_39162566/article/details/129259017

    DesignPattern-Creational-ObjectPool:设计模式-创新-对象池

    因此,从池中删除对象时,在将对象放回之前,该对象在池中不可用。 组对象具有生命周期: 创建验证销毁。 顺序图 优势 提供显着的性能提升。 管理您的连接,并提供一种重用和共享它们的方式。 当类的实例的初始化...

    多线程:从对象池(objectpool)谈同步(syncronization)——一个调试的问题

    还记得JeffryRichter在《Appiled.NETFrameworkProgramming》里的那个利用对象复苏设计的那个对象池吗?且请容许我把代码在这里再贴一遍: 1using System; 2 3using System.Collections; 4 5 

    深度剖析C++对象池自动回收技术实现

    对象池通过对象复用的方式来避免重复创建对象,它会事先创建一定数量的对象放到池中,当用户需要创建对象的时候,直接从对象池中获取即可,用完对象之后再放回到对象池中,以便复用。这种方式避免了重复创建耗时或耗...

    mydotey-objectpool

    MyDotey对象池 MyDotey ObjectPool,一个通用的对象池,基于ConcurrentHashMap&BlockingQueue的实现,易于使用。 分别在java / dotnet中实现。 代码是干净的。 易于阅读。 ThreadPool和AutoScaleThreadPool也是基于...

    .Net Core中ObjectPool的使用与源码解析

    一、对象池  运用对象池化技术可以显著地提升性能,尤其是当对象的初始化过程代价较大或者频率较高。下面是ObjectPool源码中涉及的几个类。当你看过.Net Core源码很多时,你会发现,微软的开发很多都是这种模式,...

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

    对象池分级管理,可以创建对象池,缓存池,缓式加载。

    object-pool-2:用于异步回收对象分配的构造函数特定对象池实现

    对象池-2 用于异步回收对象分配的构造函数特定对象池实现。 安装 npm install object-pool-2 --save 用法 var objectPool = require('object-pool-2')(Constructor); 创建一个新的对象池。 接受一个将在内部使用...

    ObjectPool_v1.0

    ObjectPool_v1.0

    go-commons-pool:用于golang的通用对象池

    Go Commons Pool是用于的通用对象池,可以直接从重写。 特征 支持自定义 。 丰富的池配置选项,可以精确控制池对象的生命周期。 参见 。 池LIFO(后进先出)或FIFO(先进先出) 池盖配置 池对象验证配置 池对象...

    ObjectPool.zip

    一个完美的对象池工具,完美封装的了一键生成对象,卸载,回收等功能,是以ObjectPoolManager管理所有的对象池,以对象名称命名的对象池管理该对象的所有对象,且使用了发消息机制,封装了可以对象生成和回收的作...

    ObjectPool_v1.1.zip

    ObjectPool_v1.1.zip

    ObjectPool.cs

    Unity对象池,减少直接销毁产生的内存消耗,降低DrawCall

    Object Pool 简单实现

    演示了如果您的对象需要从一个Factory构造,或当你的对象是用Emit生成时,如何简单继承ObjectPool类,实现特殊的对象的池化操作。

    Design-Patterns-in-Java:各种设计模式的Java实现

    [对象池] (ObjectPool/)行为设计模式行为设计模式是定义不同对象和类如何相互通信的蓝图。[翻译] (Interpreter/) 仅适用于 Java 8,在接口中使用默认方法! 迭代器观察员[模板方法] (TemplateMethod/) 【责任链】...

Global site tag (gtag.js) - Google Analytics