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

扩展下Object Pool的设计

 
阅读更多
首先需要了解些java并发教程,其实java也是可以通过native的本地方法去操作底层api的,比如大家所知道Aomic、CAS等概念性的操作。

下面一篇文章是来源于CSDN的觉得挺好的讲关于unsafe的

http://blog.csdn.net/aesop_wubo/article/details/7537278

下面是一个重新设计过的对象池的获取

public class FastObjectPool<T> {
	private Holder<T>[] objects;
	private volatile int takePointer;
	private int releasePointer;
	private final int mask;
	private final long BASE;
	private final long INDEXSCALE;
	private final long ASHIFT;
	public ReentrantLock lock = new ReentrantLock();
	private ThreadLocal<Holder<T>> localValue = new ThreadLocal<Holder<T>>();
	@SuppressWarnings("unchecked")
	public FastObjectPool(PoolFactory<T> factory, int size) {

		int newSize = 1;
		while (newSize < size) {
			newSize = newSize << 1;
		}
		size = newSize;
		objects = new Holder[size];
		for (int x = 0; x < size; x++) {
			objects[x] = new Holder<T>(factory.create());
		}
		mask = size - 1;
		releasePointer = size;
		BASE = THE_UNSAFE.arrayBaseOffset(Holder[].class);
		INDEXSCALE = THE_UNSAFE.arrayIndexScale(Holder[].class);
		ASHIFT = 31 - Integer.numberOfLeadingZeros((int) INDEXSCALE);
	}

	public Holder<T> take() {
		int localTakePointer;

		Holder<T> localObject = localValue.get();
		if (localObject != null) {
			if (localObject.state.compareAndSet(Holder.FREE, Holder.USED)) {
				return localObject;
			}
		}

		while (releasePointer != (localTakePointer = takePointer)) {
			int index = localTakePointer & mask;
			Holder<T> holder = objects[index];
			// if(holder!=null && THE_UNSAFE.compareAndSwapObject(objects,
			// (index*INDEXSCALE)+BASE, holder, null))
			if (holder != null
					&& THE_UNSAFE.compareAndSwapObject(objects,
							(index << ASHIFT) + BASE, holder, null)) {
				takePointer = localTakePointer + 1;
				if (holder.state.compareAndSet(Holder.FREE, Holder.USED)) {
					localValue.set(holder);
					return holder;
				}
			}
		}
		return null;
	}

	public void release(Holder<T> object) throws InterruptedException {
		lock.lockInterruptibly();
		try {
			int localValue = releasePointer;
			// long index = ((localValue & mask) * INDEXSCALE ) + BASE;
			long index = ((localValue & mask) << ASHIFT) + BASE;
			if (object.state.compareAndSet(Holder.USED, Holder.FREE)) {
				THE_UNSAFE.putOrderedObject(objects, index, object);
				releasePointer = localValue + 1;
			} else {
				throw new IllegalArgumentException("Invalid reference passed");
			}
		} finally {
			lock.unlock();
		}
	}

	public static class Holder<T> {
		private T value;
		public static final int FREE = 0;
		public static final int USED = 1;

		private AtomicInteger state = new AtomicInteger(FREE);

		public Holder(T value) {
			this.value = value;
		}

		public T getValue() {
			return value;
		}
	}

	public static interface PoolFactory<T> {
		public T create();
	}

	public static final Unsafe THE_UNSAFE;
	static {
		try {
			final PrivilegedExceptionAction<Unsafe> action = new PrivilegedExceptionAction<Unsafe>() {
				public Unsafe run() throws Exception {
					Field theUnsafe = Unsafe.class
							.getDeclaredField("theUnsafe");
					theUnsafe.setAccessible(true);
					return (Unsafe) theUnsafe.get(null);
				}
			};

			THE_UNSAFE = AccessController.doPrivileged(action);
		} catch (Exception e) {
			throw new RuntimeException("Unable to load unsafe", e);
		}
	}
}

分享到:
评论

相关推荐

    Object Pool-Demo

    在Unity3D游戏开发中,"Object Pool"是一种优化技术,用于管理游戏对象的创建和销毁,以提高性能并减少垃圾回收(Garbage Collection)的压力。本Demo是针对Unity3D内置对象池的一个实例,通过对比使用和不使用对象...

    Unity PoolManager v7.0.1.zip

    Unity PoolManager v7.0.1 是一个专为Unity游戏引擎设计的对象池管理插件,其主要目的是优化游戏性能,减少资源的频繁创建与销毁,从而避免内存碎片和提高游戏运行效率。对象池是一种常见的资源管理策略,尤其在处理...

    commons-pool.jar

    在软件设计中,对象池模式是一种常用的优化手段,尤其在频繁创建和销毁对象的场景下,例如数据库连接池、线程池等。 Apache Commons Pool 提供了灵活且可扩展的框架,用于创建对象池。这个库的核心在于它的`...

    CommonPool2Demo

    Apache Commons Pool2提供了可扩展的对象池API,它支持自定义对象池策略,如最大活动对象数、空闲对象超时等。这个库广泛应用于数据库连接池(如HikariCP、C3P0)和其他需要高效复用对象的场景。 **核心概念:** 1....

    commons-pool2-2.4.3-bin.zip

    4. **获取和归还对象**:通过调用pool的borrowObject()和returnObject()方法来获取和归还对象。 5. **关闭对象池**:在不再使用对象池时,调用pool的close()方法释放资源。 总的来说,Apache Commons Pool2是Java...

    PoolManager v5.8.1

    PoolManager v5.8.1 是一个专为Unity游戏引擎设计的对象池系统,它旨在提高游戏性能和效率。对象池是一种资源管理策略,通过预先创建并缓存一组对象,而不是在需要时每次创建新对象,从而减少频繁的内存分配和销毁...

    commons-pool2-2.3-bin.zip

    Apache Commons Pool 是 Apache 软件基金会的一个项目,它的目标是提供一个可扩展且高度灵活的对象池实现。 在"commons-pool2-2.3"这个版本中,包含了以下关键组件和功能: 1. **对象池接口(Poolable)**:Apache...

    commons-pool1.5.2 jar包+源码

    对象池是一种设计模式,它维护了一个对象的集合,这些对象在使用后不是被销毁,而是被放回池中等待下一次使用。这种策略减少了创建和销毁对象的次数,提高了系统的性能,尤其是在创建对象成本较高的情况下。 **...

    unity3d PoolManager

    例如,当对象需求量增加时,它可以自动扩展池;当需求减少时,可以适当收缩池,避免资源浪费。 6. **对象分类管理**:在大型项目中,可能有多种类型的对象需要管理。PoolManager支持对不同类型的对象进行分类管理,...

    commons-pool-1.3.rar

    1. **对象池(Object Pool)**:对象池是一种设计模式,用于创建和管理一组相同类型的对象。这些对象在池中被复用,而不是每次需要时都创建新的实例,从而提高了性能和效率,特别是对于资源密集型对象如数据库连接。...

    object-c基础教程

    - **定义**: Object-C是一种通用、面向对象的编程语言,基于C语言并扩展了许多面向对象的特性。 - **应用场景**: 主要用于开发iOS和macOS应用。 - **特点**: - 继承自C语言,具有C的所有特性。 - 引入了面向对象的...

    Apache commons-pool2-2.4.2源码学习笔记

    例如,`BorrowObject.jpg`和`ReturnObject.jpg`可能展示了从对象池中借用和归还对象的过程。 在`ObjectPool`的基础上,`KeyedObjectPool`进一步扩展了功能,允许我们存储和管理键值对形式的对象。这在需要按特定键...

    commons-pool-1.5.4-src.tar.gz

    2. **线程安全**:Apache Commons Pool 1.5.4 为多线程环境设计,保证了在并发环境下的正确性。通过锁机制和同步策略,确保了对象池在多个线程同时访问时的稳定性和一致性。 3. **配置灵活性**:Pool 提供了丰富的...

    配置Object+Store对象存储.doc

    OSD的设计允许数据的副本或者通过擦除编码进行冗余,以确保即使在硬件故障的情况下,数据也能得到保护。 1. **单个设备支持**: 每个OSD通常由单个存储设备支持,如一个硬盘或固态盘。这种配置简单,但可能限制了...

    Object-c学习文档

    ### Object-C 学习文档知识点总结 #### 开始学习Objective-C ...以上是对“Object-C学习文档”标题和描述中的知识点进行了详细的解释和扩展。希望这份文档能帮助初学者更好地理解和学习Objective-C。

    commons-pool2-2.4.2-src

    - Apache Commons Pool2的设计允许用户自定义对象工厂、剔除策略以及各种池行为,这使得它在多种场景下都能灵活适应。 - 通过实现`PooledObjectFactory&lt;T&gt;`,用户可以控制对象的创建、初始化、验证和销毁过程。 5...

    commons-pool2-2.9.0.jar

    在`commons-pool2-2.9.0.jar`中,这个机制被实现为一个灵活且可扩展的框架,适用于各种需要资源管理的场景。它包括核心的Pool接口和一些实现类,如GenericObjectPool和PooledObjectFactory,它们是构建和操作对象池...

    PoolManager+v6.0.0+ 添加中文注释版

    PoolManager是一款针对Unity引擎设计的对象池管理组件,其v6.0.0版本更是在原有基础上进行了优化,且贴心地添加了中文注释,使得开发者能够更加便捷地理解和使用。 对象池的概念是预先创建并维护一定数量的对象,而...

    object c教程 pdf

    - **定义**:Object-C(常写作 Objective-C 或 Obj-C)是一种基于 C 语言的面向对象编程语言,它继承了 C 语言的基本特性,并在此基础上进行了扩展。 - **特点**:作为一种面向对象的编程语言,Object-C 支持单一...

Global site tag (gtag.js) - Google Analytics