三大基本对象:html
ObjectPool的默认实现是DefaultPool,对象池的建立由ObjectPoolProvider抽象类的默认实现DefaultObjectPoolProvider类实现。架构
public class DefaultObjectPoolProvider : ObjectPoolProvider { /// <summary> /// The maximum number of objects to retain in the pool. /// </summary> public int MaximumRetained { get; set; } = Environment.ProcessorCount * 2; /// <inheritdoc/> public override ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy) { if (policy == null) { throw new ArgumentNullException(nameof(policy)); } if (typeof(IDisposable).IsAssignableFrom(typeof(T))) { return new DisposableObjectPool<T>(policy, MaximumRetained); } return new DefaultObjectPool<T>(policy, MaximumRetained); } }
IPooledObjectPolicy接口有对应的抽象类及默认实现,对象池中的对象(也就是池对象)的建立或返回由此策略类来控制。ide
public override T Get() { var item = _firstItem; if (item == null || Interlocked.CompareExchange(ref _firstItem, null, item) != item) { var items = _items; for (var i = 0; i < items.Length; i++) { item = items[i].Element; if (item != null && Interlocked.CompareExchange(ref items[i].Element, null, item) == item) { return item; } } item = Create(); } return item; } // Non-inline to improve its code quality as uncommon path [MethodImpl(MethodImplOptions.NoInlining)] private T Create() => _fastPolicy?.Create() ?? _policy.Create(); public override void Return(T obj) { if (_isDefaultPolicy || (_fastPolicy?.Return(obj) ?? _policy.Return(obj))) { if (_firstItem != null || Interlocked.CompareExchange(ref _firstItem, obj, null) != null) { var items = _items; for (var i = 0; i < items.Length && Interlocked.CompareExchange(ref items[i].Element, obj, null) != null; ++i) { } } } }
==从总体的设计思路来讲,提供者Provider用来提供具体的对象池,传入的参数也是策略类,而策略类则把控池对象的具体处理。dotnet core中不少源码的开发模式都是这种:经过Policy构建Provider,经过Provider建立最终的类。也就是说,只经过策略类来实现自定义扩展,这种架构能够借鉴和思考。==设计
官方实现:code
Object reuse with ObjectPool in ASP.NET Coreorm
参考示例:htm