三大基本對象: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