欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ObjectPool 对象池设计模式

程序员文章站 2022-07-04 12:36:18
Micosoft.Extension.ObjectPool 源码架构、模式分析: 三大基本对象: 1. ObjectPool抽象类 2. ObjectPoolProvider抽象类 3. IPooledObjectPolicy接口 ObjectPool的默认实现是DefaultPool,对象池的创建 ......
micosoft.extension.objectpool
源码架构、模式分析:

三大基本对象:

  1. objectpool抽象类
  2. objectpoolprovider抽象类
  3. ipooledobjectpolicy接口

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接口有对应的抽象类及默认实现,对象池中的对象(也就是池对象)的创建或返回由此策略类来控制。

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创建最终的类。也就是说,只通过策略类来实现自定义扩展,这种架构可以借鉴和思考。==

官方实现:

object reuse with objectpool in asp.net core

参考示例:

.net core中object pool的简单使用

.net core中的objectpool

.net core 3.0之深入源码理解objectpool(二)