.net core中的对象池
asp.net core中通过扩展库的方式提供给了一个标准的对象池ObjectPool,定义在Microsoft.Extensions.ObjectPool.dll 程序集中。它本身是个纯虚的抽象类,它就定义了两个接口函数,实现如下
public abstract class ObjectPool<T> where T : class
{
public abstract T Get();
public abstract void Return(T obj);
}
这是一个比较典型的对象池接口:
- Get函数用于从对象池获取对象,如果对象池没有可用对象,则会新建
- Return函数用于对象使用完成后,将对象放回对象池,如果对象池容量已满,则交由系统GC回收。
由于抽象类ObjectPool无法直接使用,虽然接口实现并不复杂,但实现起来还是要花一番功夫的。因此,该库也还提供了一个默认实现DefaultObjectPool,如下就是一个简单的示例:
public class Program
{
public static void Main(string[] args)
{
var policy = new DefaultPooledObjectPolicy<TestData>();
var pool = new DefaultObjectPool<TestData>(policy, ); var obj = pool.Get();
pool.Return(obj); var obj2 = pool.Get();
Console.WriteLine(obj.Equals(obj2));
}
} class TestData
{
public string Id { get; set; }
public string Name { get; set; }
public int Value { get; set; }
}
DefaultObjectPool是一个默认的实现,它是线程安全的,我们可以放心在多线程环境下使用。它有两个输入参数:对象池策略IPooledObjectPolicy和线程池容量。
对象池策略IPooledObjectPolicy接口定义如下:
public interface IPooledObjectPolicy<T>
{
T Create();
bool Return(T obj);
}
它声明了对象的创建和释放的行为。接口看起来和线程池的接口非常相似,这样设计的好处有:
- IPooledObjectPolicy负责对象创建和释放这种多变的行为,更加灵活,容易扩展
- IPooledObjectPolicy只需要考虑的创建和释放即可,实现起来比较简单。线程安全,对象管理、维护都交由DefaultObjectPool来维护即可。
系统默认也有一个IPooledObjectPolicy的实现DefaultPooledObjectPolicy,它的实现如下:
public class DefaultPooledObjectPolicy<T> : PooledObjectPolicy<T> where T : class, new()
{
public override T Create()
{
return new T();
}
public override bool Return(T obj)
{
return true;
}
}
非常简单,并且大多数的时候也够用。当然,我们也可以根据需要实现自己的IPooledObjectPolicy。甚至也可以扩展DefaultObjectPool来实现自己的线程池。
.net core中的对象池的更多相关文章
- Java中的对象池技术
java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...
- Unity编程标准导引-3.4 Unity中的对象池
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...
- Java 中的对象池实现
点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 最近在 ...
- 关于tomcat中Servlet对象池
Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端 ...
- GameObjectPool——Unity中的对象池
这里介绍一种对象池的写法.它的优点在于无论取出还是插入游戏物体都是常数量时间. using UnityEngine; using System.Collections; using System.Co ...
- Egret中的对象池ObjectPool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...
- Egret中的对象池Pool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 一 对象池A 二 对象池B 一 对象池A 1. 支持传入构造函数 2. 支持预先创建对象 3. 支持统一执行函数 /** * ...
- ASP.NET Core 中的对象映射之 AutoMapper
目录 AutoMapper 简介 AutoMapper 使用 初始化 Profile设置 扁平化映射 集合映射 投影 条件映射 值转换 设置转换前后行为 配置验证及设置 反向映射 自定义转换器 自定义 ...
- 对象池在 .NET (Core)中的应用[2]: 设计篇
<编程篇>已经涉及到了对象池模型的大部分核心接口和类型.对象池模型其实是很简单的,不过其中有一些为了提升性能而刻意为之的实现细节倒是值得我们关注.总的来说,对象池模型由三个核心对象构成,它 ...
随机推荐
- 【BZOJ4155】[Ipsc2015]Humble Captains
题解: 第一问裸的最小割 第二问考虑贪心 我们把边权平均分配给两个点 然后就变成了给n个数分两组差最小 np-hard问题 暴力背包,操作存在区间左移,右移,or bieset优化
- python之PIL 二值图像处理和保存
0. 1.参考 http://pszpcl.baike.com/article-77327.htmlwindows 图片右键:属性 详细信息 位深度位深度 用于指定图像中的每个像素可以使用的颜色信息数 ...
- 【转载】DDD分层架构的三种模式
引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...
- HDU4185 Oil Skimming 二分图匹配 匈牙利算法
原文链接http://www.cnblogs.com/zhouzhendong/p/8231146.html 题目传送门 - HDU4185 题意概括 每次恰好覆盖相邻的两个#,不能重复,求最大覆盖次 ...
- 最接近的三数之和(给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数, 使得它们的和与 target 最接近。返回这三个数的和)
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2). 思路:首先对数组进行排序 ...
- day19 正则,re模块
http://www.cnblogs.com/Eva-J/articles/7228075.html 所有常用模块的用法 正则的规则: 在一个字符组里面枚举合法的所有字符,字符组里面的任意一个字符和 ...
- java反射对实体类取值和赋值
public static void checkDesignerEdit(Object dtos) throws Exception { Class dtosClass = dtos.getClass ...
- 005.Ceph文件系统基础使用
一 Ceph文件系统 1.1 概述 CephFS也称ceph文件系统,是一个POSIX兼容的分布式文件系统. 实现ceph文件系统的要求: 需要一个已经正常运行的ceph集群: 至少包含一个ceph元 ...
- 双11线上压测netty内存泄露
最近线上压测,机器学习模型第一次应用到线上经历双11大促.JSF微服务有报错 LEAK: ByteBuf.release() was not called before it's garbage-co ...
- excel 删除重复项
excel 删除重复项 单击“数据”按钮会出现如图所示,这时我们可以看到,在下分的菜单栏里有一个“删除重复项”选项,单击该选项.