`
sunxboy
  • 浏览: 2829790 次
  • 性别: 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);  
        }  
    } 
}

 

分享到:
评论

相关推荐

    ObjectPool:Android 对象池

    对象池模式是一种软件创建设计模式,它使用一组随时可用的初始化对象——一个“池”——而不是按需分配和销毁它们。 池的客户端将从池中请求一个对象并对返回的对象执行操作。 当客户端完成后,它将对象返回到池中...

    Pool:简单的 JavaScript 对象池

    两种实现的用法几乎相同。 对象池 对象池是一组已初始化的对象,可以随时使用,而不是按需分配和销毁。 池的客户端将从池中请求一个对象,并对返回的对象执行操作。 当客户端处理完一个对象时,它将它返回到池中...

    C#实现COM+对象池服务(通过TCP管道的和不通过TCP管道的代码例)

    对象池是COM+提供的一种服务。它可用于在池中保持组件的活跃。

    golang实现基于channel的通用连接池详解

    golang的channel除了goroutine通信之外还有很多其他的功能,本文将实现一种基于channel的通用连接池。下面话不多说了,来一起看看详细的介绍吧。 功能 * 连接池中连接类型为interface{},使得更加通用 * 链接的最大...

    commons-pool2-2.4.2.zip

    一种办法就是使用对象池,每次创建的对象并不实际销毁,而是缓存在对象池中,下次使用的时候,不用再重新创建,直接从对象池的缓存中取即可。为了避免重新造轮子,我们可以使用优秀的开源对象池化组件apache-commons...

    java-JSP数据库连接池的研究与实现(源代码+论文)

    针对这些突出问题,因此提出了一种基于数据库连接池技术的有效解决方法。简而言之,数据库连接池主要作用是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个;...

    objects.js:使用Javascript进行高性能游戏的核心类工具和对象池

    通用对象池-垃圾回收不好,自动超快速对象池好! 类和对象ID LinkedList-高性能的双链表 设备-与设备无关的地图(嗯,无论如何还是一个起点) 为什么? 我喜欢用javascript开发大型高性能的游戏,例如游戏,但是...

    基于Tomcat的数据库连接池配置和测试 的三种方法

    数据连接池的工作机制:J2EE服务器启动时会建立一定数量的池连接,并...实现方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正关连接,而是把它代理的Connection对象还回到连接池中。

    设计模式:单例设计模式(全部实现方式)工厂设计模式,抽象工厂模式

    工厂设计模式是一种创建型设计模式,它的主要目标是将对象的创建和使用分离,使得代码更具有可维护性和可扩展性。该模式通常会定义一个工厂接口或抽象类,由具体的工厂类实现该接口或抽象类来创建相应的产品。工厂...

    超级有影响力霸气的Java面试题大全文档

     对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。  Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless ...

    《内存管理编程指南》PDF

    “自动释放池”描述了自动释放池—一种延迟回收的机制—在Cocoa程序中的用法。“存取方法”向您介绍如何实现存取方法。“实现对象复制”讨论有关对象复制的问题,比如如何决定是执行深拷贝还是浅拷贝,在您自己的...

    Python 基础 之 python 进程知识点整理,实现一个简单使用进程池的多进程文件夹文件copy器

    Python 基础 之 python 进程知识点整理,实现一个简单使用进程池的多进程...是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目

    基于KNN+SVM+CNN+LSTM四种方法实现遥感图像识别python源码.zip

    在机器学习中,SVM是一种常用的监督学习算法,其目的在于寻找一个超平面,能够以最大间隔将各类数据分开。作为传统的机器学习算法中表现非常优秀的一种算法,SVM在许多场景中都得到了应用。 CNN 卷积神经网络是...

    [java]读书笔记整理:一切都是对象

    一种通用的内存池(也位于RAM区),用于存放所有的java对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当...

    java笔试题大集合及答案(另附各大公司笔试题)

    它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,...

    C接口与实现?内存管理(内存池的实现)

    free的时候频繁的系统调用肯定会影响到系统的性能,这里有一种更有效的内存管理方式是基于块的内存分配方式也是我们经常说的内存池(在软件的世界中你可以发现很多类似的池化设计),下面来实现一个简单的内存池。...

    deadpool:使用Async-Await的生锈简单死池实现

    此板条箱提供了两种实现: 托管池( deadpool::managed::Pool ) 根据需要创建和回收对象 对于很有用 通过Cargo.toml的managed功能启用 非托管池( deadpool::unmanaged::Pool ) 所有对象都需要由用户创建并...

    数据库连接池连接数据库

    JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI SPI的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,...

    设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板.pptx

    7享元模式:共享池模式享元模式:共享池模式 设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板全文共22页,当前为第8页。 logo 8原型模式:浅拷贝和深度拷贝原型模式:浅拷贝和深度拷贝 设计模式(JAVA语言...

    JDCS_实现高性能计算的分布式计算系统

    是 当 前 比 较 成 熟 的 一 种 分 布 对 象 技 术,它提供了使用 对象的简单和直接的方法。该文建立基于 方法的适用于高性能计算的分布式计算系统 。在 中由网络上的计算结点构成服务器池,为用户提供高性能的计算...

Global site tag (gtag.js) - Google Analytics