对象池机制

1.什么时候需要创建对象池

      当我们频繁创建删除大量对象的时候,对象的创建删除所造成的开销就不容小觑了。为了提高性能,我们往往需要实现一个对象池作为Cache:使用对象时,它从池中提取。用完对象时,它放回池中。从而减少创建对象的开销。对象池服务可以减少从头创建每个对象的系统开销。在激活对象时,它从池中提取。在停用对象时,它放回池中,等待下一个请求。对象池大多是需要支持多线程访问的,因此需要考虑线程安全问题。

2.实例—— 如何创建一个对象池

关键:申请对象,创建对象,释放对象,对象池最大容量

namespace CreatObjectPool
{
    public class ObjectPool<T>
    {
        /// <summary>
        /// ConcurrentBag<T> 的所有公共且受保护的成员都是线程安全的
        /// 可从多个线程同时使用。
        /// </summary>
        ConcurrentBag<T> buffer;
        // Func和Action委托的唯一区别在于Func要有返回值, Action没有返回值 
        Func<T> creatFunc;
        Action<T> resetFunc;
        public int capacity { get; private set; }
        public int count { get { return buffer.Count(); } }

        public ObjectPool(Func<T> creatFunc, Action<T> resetFunc, int capacity)
        {
            Contract.Assume(creatFunc != null);
            Contract.Assume(capacity > 0);

            this.buffer = new ConcurrentBag<T>();
            this.creatFunc = creatFunc;
            this.resetFunc = resetFunc;

            this.capacity = capacity;
        }
        /// <summary>
        /// 申请对象,若有从池中移除并返回取出的对象
        /// 若没有则创建新的对象,并返回该对象
        /// </summary>
        /// <returns></returns>
        public T GetObject()
        {
            var obj = default(T);
            if (!buffer.TryTake(out obj))
                return creatFunc();
            else
                return obj;
        }
        public void PutObject(T obj)
        {
            Contract.Assume(obj != null);

            if (count>capacity)
            {
                return;
            }
            if (resetFunc != null)
            {
                resetFunc(obj);
            }

            buffer.Add(obj);
        }
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值