浅谈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 <= )
{
throw new ArgumentException("concrrent");
}
if (activator==null)
{
throw new ArgumentNullException("activator");
}
gate = new Semaphore(concrrent, concrrent);
pool = new Stack<T>();
for (int i=;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 = ; 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.
浅谈Pool对象的更多相关文章
- python学习(28) 浅谈可变对象的单例模式设计
python开发,有时候需要设计单例模式保证操作的唯一性和安全性.理论上python语言底层实现和C/C++不同,python采取的是引用模式,当一个对象是可变对象,对其修改不会更改引用的指向,当一个 ...
- 浅谈 js 对象 toJSON 方法
前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一个道理,他是给 stringify 方法字 ...
- JS核心系列:浅谈原型对象和原型链
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...
- 浅谈Js对象的概念、创建、调用、删除、修改!
一.我们经常困惑,对象究竟是什么,其实这是一种思维,一种意识上的东西,就像我们都说 世界是有物质组成的道理一样,理解了下面的几句话!对象也不是那么抽象! 1.javascript中的所有事 ...
- 浅谈Java对象回收的三种方式
半夜睡不着,加上最近在看Java虚拟机,写点给新手和自己看的东西. 第一类:生命周期中止 void scope(){ Test t = new Test(); } 第二类:对象无引用 (一).对象的应 ...
- HTML5 拖放(Drag 和 Drop)功能开发——浅谈dataTransfer对象
[前言] 之前我已经为大家介绍过一篇有关HTML5中原生拖拽的相关知识了.今天为大家介绍HTML5拖拽中的其他一些关于dataTransfer对象的知识和应用. dataTransfer对象 之前的一 ...
- 浅谈Java对象的equals方法
相等与同一: 如果两个对象具有相同的类型以及相同的属性值,则称这两个对象相等. 如果两个引用对象指的是同一个对象,则称这两个变量同一. ==是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的 ...
- 【一个小功能】从js判断ie版本,浅谈navigator对象的appName属性
判断IE版本主要的是获取两个属性,a.当前浏览器名称,b.当前浏览器版本,为此不得不了解navigator对象. 先贴代码 window.onload = function() { var brows ...
- 浅谈history对象以及路由插件原理
简介 History对象最初设计用来表示窗口的浏览历史,但是,出于隐私方面的原因,History对象不再允许脚本访问已经访问过的实际URL.虽然,我们不清楚历史URL,但是,我们可以通过History ...
随机推荐
- php curl 上传json数据
PUT $data = array('username'=>'dog','password'=>'tall'); $data_json = json_encode($data); $ch ...
- if语句&switch&Scanner
if流程控制语句: if 语句的用语法如下: if(boolean表达式){ //如果条件为true那么执行 } 只有条件为true时才会执行,否则执行if语句后面的代码. 实例代码: public ...
- ASP.NET gridview导出excel,防止繁体产生有乱码的方式
//1.先引用比如 : using System; using System.Collections.Generic; using System.Linq; using System.Web; usi ...
- github爬虫100项目
为了更好的巩固所学,在github上开始100爬虫项目,记录学习过程,也希望对他人的学习有帮助,目前还在持续更新中,有兴趣可以看看 地址: https://github.com/mapyJJJ/100 ...
- zipCrack-v1.1 工具介绍
一个暴力破解zip的工具 用python开发 与kali 自带的fcrackzip类似 git地址:https://github.com/mapyJJJ/python3-for-linux-h-.gi ...
- Vue系列之 => webpack-babel的配置
安装 cnpm i babel-core@6.26.3 babel-loader@7.0.0 babel-plugin-transform-runtime -D cnpm i babel-preset ...
- linux关机(重启)命令
Linux系统关机命令: #关机命令 1.halt 2.poweroff 3.shutdown -h now 立即关机(具有root权限用户使用)#重启命令 1.reboot 2.shutdown - ...
- Appium+Python3+iOS真机环境搭建
Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用. 本次环境配置相关:macOS:10.13.4Appium-desktop:1. ...
- Java-对象及变量的并发访问小结
1)多线程环境下,方法内的变量是线程安全的 2)多个线程同时处理一个实例,这个实例内的变量是不安全的 3)不同线程中注入同一个类的不同实例,实例中的变量是安全的 4)Synchronized获取到的锁 ...
- python爬虫,爬取一系列新闻
这个作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2941. 由于存在多次请求,所以稍微将请求封装如下 def tr ...