浅谈Pool对象
2016-06-05 08:38
225 查看
Pool对象的技术指标:
避免频繁创建经常使用的稀有资源,提高工作效率.
控制阀值,很多情况下一些关键资源都有一个最佳并发数,超过这个拐点性能有可能急剧下降,也有可能继续增大并发数性能不能提升.
安全的获取对象和释放对象(使用之后放回连接池)
T对象实现时最好与Pool对象建立某种关联,调用T对象实例的某个方法时可以将对象送回Pool,而不是销毁它.同时Pool对象Release对象时,最好通过事件(关联关系)判断是否是从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.
相关文章推荐
- 微信之Android各版本列表
- [置顶] 深度优先搜索
- 微信公众号开发之消息的接收与被动回复消息
- 使用观察者模式完美解决activity与fragment通信问题
- 简单图片文件上传并处理缩略图生成
- linux服务器之LVS、Nginx和HAProxy负载均衡器对比总结
- 第十四周学习进度
- iOS开 4000 发时关于UILabel文本高度和宽度的计算问题(单行、多行)
- 12个非常实用的JavaScript小技巧
- getch(),getche(),getchar(),gets(),scanf()的区别
- 正则表达式--抓取email地址
- 2833 奇怪的梦境
- OSChina 周日乱弹 ——儿子在别人手上,怎么办!
- 第二次冲刺个人工作总结12
- 表单提交原理
- 2488 绿豆蛙的归宿
- 每天一个Linux命令(38)top命令
- VS2013 未找到与約束ContractName
- 第二期冲刺每日站立会议——20160605
- 在表单提交前进行验证的几种方式