`
sunxboy
  • 浏览: 2887841 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

对象池的一种实现

 
阅读更多
import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

import sun.misc.Unsafe;
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", "restriction" })  
    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);  
    }  
  
    @SuppressWarnings("restriction")
	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;  
    }  
  
    @SuppressWarnings("restriction")
	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();  
    }  
    
    @SuppressWarnings("restriction")
	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);  
        }  
    } 
}

 

分享到:
评论

相关推荐

    万能对象池【C#实现】

    总结来说,C#实现的万能对象池是通过泛型和面向对象的设计来提供一种通用的资源管理机制,优化了对象生命周期的管理,减少了垃圾回收的频率,提升了程序运行效率。在实际项目中,根据需求对对象池进行适当的定制和...

    apache对象池的实现

    总结来说,Apache对象池是一种优化资源使用的技术,通过Apache Commons Pool库,我们可以轻松地为自己的对象实现对象池。这不仅可以提高性能,还可以减少系统资源的消耗。在实际项目中,尤其是在处理大量短生命周期...

    Java对象池实现源码

    在Java编程中,对象池是一种优化资源管理的技术,它的核心思想是预先创建并维护一组对象,供程序在需要时重复使用,而不是每次需要时都创建新的对象。这有助于减少对象的创建和销毁带来的开销,特别是在频繁创建和...

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

    对象池是一种软件设计模式,主要用于管理那些频繁创建与销毁且代价较高的对象。通过预先创建一定数量的对象,并将其保存在一个集合(通常称为池)中,当需要使用这些对象时,可以直接从池中获取已创建的对象,而不是...

    C++对象池源码示例

    对象池是一种优化资源管理的技术,特别是在频繁创建和销毁对象的场景下。本篇将深入探讨对象池的概念、工作原理以及如何在C++中实现对象池。 对象池的基本思想是预先创建并维护一组对象,而不是每当需要时就动态地...

    工厂设计模式附加对象池说明

    对象池是一种资源管理技术,用于预先创建一组对象并存储在一个“池”中,当需要对象时,可以从池中获取,而不是每次需要时都创建新的对象。这样可以显著减少对象的创建和销毁开销,尤其是在创建对象成本高或者系统...

    UE4 Actor对象池插件

    对象池是一种内存管理策略,它预先创建并存储一组对象,当需要时可以从池中获取,而不是每次都新建,从而避免了频繁的内存分配和释放操作。 在UE4中,"Actor"是游戏世界中的基本元素,可以是角色、物体、环境等任何...

    deePool高效的JavaScript对象池

    DeePool通过实现JavaScript对象池,为开发者提供了一种优化内存使用、提高程序运行效率的有效手段。尤其在需要大量创建和销毁对象的场景下,使用DeePool可以显著提升性能,减少内存压力。掌握并合理运用DeePool,...

    c++实现游戏开发中常用的对象池(含源码)

    在游戏开发中,对象池是一种优化技术,用于高效管理大量短生命周期的对象,避免频繁地创建和销毁对象导致的性能开销。本资源提供了一个用C++实现的对象池模型,包括了源码,可以帮助开发者深入理解并应用对象池设计...

    C#自定义对象池

    在C#编程中,对象池是一种优化资源管理的技术,它主要用于减少对象的创建和销毁的开销。在数据库操作中,频繁地打开和关闭数据库连接会导致大量的系统资源消耗,包括内存和CPU时间。通过实现自定义的对象池,我们...

    高效的,固定大小的对象池

    在计算机科学和编程领域,对象池是一种内存管理策略,它预先创建并维护一组对象,以供重复使用,而不是每次需要时都创建新对象。这种方式可以显著提高程序性能,特别是对于那些生命周期短暂但创建成本较高的对象。...

    对象池简单Demo(资源包)

    对象池是一种内存管理策略,通过预先创建一组对象并保持在内存中,而不是每次需要时都创建新的对象。当对象不再使用时,不是将其销毁,而是将它放回池中供后续使用。这种方式减少了垃圾回收的压力,提高了程序运行...

    unity子弹对象池详细注释

    在Unity游戏开发中,对象池是一种优化资源管理的技术,它能有效地减少对象的频繁创建与销毁,从而提高游戏性能。本教程将详细讲解基于Unity的子弹对象池实现,以及如何通过注释理解并扩展其功能。 一、对象池概念 ...

    对象池的一个小例子

    在软件开发中,特别是针对高性能、高并发的应用场景,对象池技术是一种非常实用的设计模式。它主要用于避免频繁创建和销毁对象所带来的性能开销,特别是在对象创建成本较高时更为明显。 #### 二、对象池的工作原理 ...

    性能优化_对象池

    "对象池"是一种常见的性能优化策略,它针对的是频繁创建和销毁对象所导致的性能损失。本文将深入探讨对象池的概念、工作原理以及在实际应用中的优势和注意事项。 对象池的基本思想是预先创建并维护一组对象,而不是...

    对象池

    对象池是一种在软件设计中常见的优化技术,主要目的是提高程序性能和减少系统资源的消耗。在Java编程中,对象池通常用于管理那些创建和销毁成本较高的对象,通过复用已存在的对象来避免频繁的实例化操作。这个压缩...

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

    对象池是一种设计模式,它的核心思想是预先创建一组对象并存储在一个集合中,当需要对象时,从池中获取,而不是每次使用时都创建新的对象。在Java中,`java.util.concurrent`包下的`ObjectPool`接口就是用于定义...

    用Dictionary写的对象池

    总结来说,使用Dictionary实现的对象池是一种有效的资源管理策略,尤其适用于需要频繁创建和销毁对象的场景。通过合理设计和优化,可以显著提升应用程序的性能和资源利用率。在实际应用中,应根据具体需求来决定是否...

    unity对象池的案例Demo

    Unity对象池是一种优化游戏性能的技术,它通过预先创建并存储一系列可重用的游戏对象,避免了频繁的对象实例化和销毁过程,从而减少了内存碎片和CPU开销。在本案例Demo中,我们将深入探讨Unity对象池的工作原理、...

    对象池 射击游戏 子弹的反复生成

    对象池是一种在软件开发中,特别是游戏开发中广泛使用的优化技术。它的主要目的是为了提高程序性能,减少系统资源的频繁创建和销毁,特别是在处理大量短暂生命周期的对象时,如射击游戏中频繁生成和消失的子弹。 在...

Global site tag (gtag.js) - Google Analytics