浅谈Pool对象

Pool对象的技术指标:

避免频繁创建经常使用的稀有资源,提高工作效率.

控制阀值,很多情况下一些关键资源都有一个最佳并发数,超过这个拐点性能有可能急剧下降,也有可能继续增大并发数性能不能提升.

安全的获取对象和释放对象(使用之后放回连接池)

public sealed class Pool<T> : IDisposable where T : IDisposable
    {
        private bool disposed = false;
        private Semaphore gate;
        private Stack<T> pool;
        public event Predicate<T> Predicate;
        public Pool(int concrrent,Func<Pool<T>,T> activator)
        {
            if (concrrent <= 0)
            {
                throw new ArgumentException("concrrent");
            }
            if (activator==null)
            {
                throw new ArgumentNullException("activator");
            }
            gate = new Semaphore(concrrent, concrrent);
            pool = new Stack<T>();
            for (int i=0;i< concrrent; i++)
            {
                pool.Push(activator(this));
            }

        }

        public T Acquire()
        {
            if (!gate.WaitOne())
                throw new InvalidOperationException();
            lock (pool)
            {
                return pool.Pop();
            }
        }

        public void Release(T target)
        {
            lock (pool)
            {
                if (Predicate!=null)
                {
                    if (Predicate(target))
                    {
                        pool.Push(target);
                        gate.Release();
                    }
                }
                else
                {
                    if (target != null)
                    {
                        pool.Push(target);
                        gate.Release();
                    }
                }
            }
        }

        private void Dispose(bool disposing)
        {
            if (disposed)
                return;
            if (disposing)
            {
                gate.Dispose();
            }
            for (int i = 0; i < pool.Count; i++)
            {
                var t = pool.Pop();
                t.Dispose();
            }
            disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        ~Pool()
        {
            Dispose(false);
        }
    }

T对象实现时最好与Pool对象建立某种关联,调用T对象实例的某个方法时可以将对象送回Pool,而不是销毁它.同时Pool对象Release对象时,最好通过事件(关联关系)判断是否是从Pool对象获取的,然后放回Pool.

时间: 2024-09-30 20:23:34

浅谈Pool对象的相关文章

浅谈 js 对象 toJSON 方法

前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一个道理,他是给 stringify 方法字符串化的时候调用的.看下 MDN 官方文档吧<toJSON behavior>.非常简单,但是要注意的是他和 stringify 方法第二个参数稍微有点不同.因为 stringify 第二个参数是回调函数时,只是对当前 key 对应的值进行修改.而 toJSON 则是对当前对象进行修改.例如: v

浅谈js对象之数据属性、访问器属性、Object.defineProperty方法

一.对象 这个不用多说,常见的几种创建对象的方法有: 1.通过构造函数创建对象,如下所示: function Person(){ } var person = new Person(); 2.通过Object创建简单对象,例如: var obj = new Object(); 3.通过字面量创建对象. var obj = {}; 常用的一般是第一种和第三种方法. 二.属性类型 javascript中有两种属性:数据属性和访问器属性,确切的说这两种特性是用来描述对象属性的各种特征,比如说这个对象属

浅谈Js对象的概念、创建、调用、删除、修改!

一.我们经常困惑,对象究竟是什么,其实这是一种思维,一种意识上的东西,就像我们都说    世界是有物质组成的道理一样,理解了下面的几句话!对象也不是那么抽象!    1.javascript中的所有事物都是对象,字符串.数值.数组.函数!    而且js还允许自定义对象!    2.对象就只是带有属性和方法的特殊数据类型    3.属性是与对象相关的值,方法是能够在对象上执行的动作! 其实在这里的时候我们应该就有一个疑问要解决了,我们说函数是一个对象,为什么?    很简单,js中所有的事物都是

【一个小功能】从js判断ie版本,浅谈navigator对象的appName属性

判断IE版本主要的是获取两个属性,a.当前浏览器名称,b.当前浏览器版本,为此不得不了解navigator对象. 先贴代码 1 window.onload = function() { 2 var browser_name = navigator.appName, //获取当前浏览器的名称 3 browser_version = navigator.appVersion, //获取当前浏览器的平台和版本信息 4 version_arr = browser_version.split(";&quo

浅谈java对象的equals方法

作为一个被问的很多的一个面试题:java中==和equals有什么区别? 网上普遍的回答都是:==比较的是内存地址,equals比较的是值. 其实这种回答是很不标准的,稍微标准一点的回答应该JDK自带的一些类对equals的实现各不同,例如 Object对象的equals的定义是这样的: public boolean equals(Object obj) { return (this == obj); } 所以在Object中==和equals是没有任何区别的. 但在String中,重写的equ

浅谈Java对象回收的三种方式

半夜睡不着,加上最近在看Java虚拟机,写点给新手和自己看的东西. 第一类:生命周期中止 void scope(){ Test t = new Test(); } 第二类:对象无引用 (一).对象的应用被转移: void life(){ Test t = new Test(); t = new Test(); } (二).对象被赋值为null void scope(){ Test t = new Test(); t = null; }

HTML5 拖放(Drag 和 Drop)功能开发——浅谈dataTransfer对象

[前言] 之前我已经为大家介绍过一篇有关HTML5中原生拖拽的相关知识了.今天为大家介绍HTML5拖拽中的其他一些关于dataTransfer对象的知识和应用. dataTransfer对象 之前的一篇文章中也有提及到dataTransfer对象,那会只是想通过dataTransfer对象来将被拖拽元素的id进行传递,使得目标元素可以通过相应的dataTransfer对象来获取id进行对应操作. 成员表 属性 描述 dropEffect 设置或获取拖曳操作的类型和要显示的光标类型. effect

浅谈Scala对象构造过程

我们通过一个例子来体会scala对象的构造过程 首先创建一个车站类: class Station { val size = 100 val spots = new Array[String](size) } 通过size来模拟停车位数,通过字符串数组模拟具体的停车位. 在创建一个停车场类,它是车站的子类 class Park extends Station { override val size = 20 } 停车场没有车站那么多车位,只拥有20个,因此在Park中重写了Station的size

浅谈promise对象

背景: 最近项目在做小程序的开发,涉及设计一个统一的登录公共方法,当实现时涉及到多个异步请求,那么问题来了,如何让多个异步请求先后同步进行呢?很多人会想到使用多层嵌套套来实现,就像这样: function fun1() { fun2() { fun3() { fun4() { } } } } 可是嵌套难以维护而且耦合性很高.不方便. 苦寻百度,最后找到Promise,Promise就是这样一个专门解决多个异步请求问题的对象. Promise 介绍 Promise是异步编程的一种解决方案,由社区提