C# | 对象池

news2024/10/6 12:37:34

在这里插入图片描述

对象池

文章目录

  • 对象池
    • 前言
    • 什么是对象池
      • 对象池的优点
      • 对象池的缺点
    • 实现思路
      • 示例代码
    • 结束语

前言

当我们开发一个系统或者应用程序时,我们通常需要创建很多的对象,这些对象可能是线程、内存、数据库连接、文件句柄等等。在某些情况下,我们需要频繁地创建和销毁这些对象,这样会导致系统的性能下降和资源的浪费。这时,我们就可以使用对象池来管理这些对象,让它们可以被重复使用,从而提高程序的运行效率。


什么是对象池

那么,什么是对象池呢?简单来说,对象池就是预先创建一定数量的对象,并将它们存储在一个池中,当需要使用对象时,从对象池中获取一个对象,并在使用完毕后将其放回池中,以便可以多次重复使用。

对象池的优点

对象池可以大幅度减少对象的创建和销毁次数,从而提高程序的运行效率和资源的利用率。同时,它还可以避免内存碎片和资源的浪费,提高系统的稳定性和可扩展性。

对象池的缺点

使用对象池也有一些劣势,对象池需要占用一定的内存空间,如果对象的数量过多,可能会导致系统的内存不足。而且对象池需要进行对象的管理和维护,如果管理不当,可能会导致对象池的效率下降或者出现竞争条件等问题。


实现思路

设计对象池的思路主要是确定对象池的大小、对象的创建方式、对象的回收方式以及线程安全等问题。通常情况下,我们需要在程序初始化时创建一定数量的对象,并将这些对象存储在对象池中。
当需要使用对象时,从对象池中获取一个可用的对象,使用完毕后将其放回对象池中。如果对象池中的对象数量不足,可以根据需要动态地创建新的对象并添加到对象池中。

示例代码

下面是一个使用C#实现简易对象池的例子:

public class ObjectPool<T>
{
    private readonly Func<T> _objectFactory;
    private readonly ConcurrentBag<T> _objects;

    public ObjectPool(Func<T> objectFactory)
    {
        _objectFactory = objectFactory;
        _objects = new ConcurrentBag<T>();
    }

    public T GetObject()
    {
        T obj;
        if (_objects.TryTake(out obj))
        {
            return obj;
        }
        return _objectFactory();
    }

    public void PutObject(T obj)
    {
        _objects.Add(obj);
    }
}

上面的代码实现了一个简单的对象池,使用了C#中的ConcurrentBag类来实现线程安全的对象管理。在创建ObjectPool对象时,需要传入一个用于创建对象的委托函数。当需要获取对象时,先尝试从对象池中获取一个可用的对象,如果对象池中没有可用的对象,则根据委托函数创建一个新的对象。使用完毕后,将对象放回对象池中。

接下来优化一下这个例子,添加一个值限制对象池中保留对象的个数,超出限制的对象会被释放掉。

public class ObjectPool<T>
{
    private readonly Func<T> _objectFactory;
    private readonly ConcurrentBag<T> _objects;
    private readonly int _maxSize;

    public ObjectPool(Func<T> objectFactory, int maxSize)
    {
        _objectFactory = objectFactory;
        _objects = new ConcurrentBag<T>();
        _maxSize = maxSize;
    }

    public T GetObject()
    {
        T obj;
        if (_objects.TryTake(out obj))
        {
            return obj;
        }
        return _objectFactory();
    }

    public void PutObject(T obj)
    {
        if (_objects.Count < _maxSize)
        {
            _objects.Add(obj);
        }
        else
        {
            IDisposable disposable = obj as IDisposable;
            if (disposable != null)
            {
                disposable.Dispose();
            }
        }
    }
}

新增了一个名为_maxSize的属性来表示对象池中最多可以保留的对象个数。在PutObject方法中,我们判断当前对象池中的对象数量是否已经达到了最大值,如果是,则释放掉超出限制的对象,否则将对象加入到对象池中。为了保证释放对象时的安全性和可靠性,我们将对象转换为IDisposable接口,如果对象实现了IDisposable接口,则调用其Dispose方法进行释放。

这样,我们就成功地为对象池添加了一个值限制,可以避免对象池中的对象数量过多导致内存溢出和性能下降的问题。当对象池中的对象数量超过限制时,我们可以选择释放对象或者将对象丢弃掉,以保证程序的稳定性和可靠性。


结束语

通过使用对象池,我们可以大幅度减少对象的创建和销毁次数,从而提高程序的运行效率和资源的利用率。同时,我们也需要考虑对象池的大小和限制等问题,以保证程序的性能和可靠性。

在未来的文章中还会介绍其他相关的池,例如线程池、内存池等,更全面地讲解池的相关知识。

如果您觉得本文对您有所帮助,欢迎点赞收藏关注。谢谢!

禁止转载声明:
本文受到版权保护,未经作者许可,严禁转载。任何机构或个人不得以任何形式将本文用于商业用途或进行二次创作、复制、转载等行为。任何未经授权使用本文所涉及的任何内容,作者保留追究法律责任的权利。如需引用本文,请务必注明出处并获得作者的明确授权。本文刊载于[https://blog.csdn.net/lgj123xj],感谢您的理解与支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/526211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CM311-1A 卡刷 + 线刷、刷安卓与 Armbian 教程

使用到的工具软件与固件下载地址&#xff1a; https://41ws38-my.sharepoint.com/:f:/g/personal/ddf_41ws38_onmicrosoft_com/EhgM458YouBBshliWJhjcDcBAU-F5Mu6HTIU8PeKJHZnZA?eZnJZa6 不能下载&#xff0c;帖子下面评论。 准备工作 设备 / 硬件&#xff1a;CM311-1a YST 电…

C语言格式化输出总结:%d,%c,%s,%f, %lf,%m.nd,%m.nf,%m.ns 以及sprintf函数

凡事发生必将有益于我&#xff0c;高手&#xff0c;从来都不仅仅是具备某种思维的人&#xff0c;而是那些具备良好学习习惯的人&#xff0c;成为高手&#xff0c;无他&#xff0c;手熟尔&#xff01; -----来自一位IT领域的大神 在最近的学习之中&#xff0c;对于格式化输出这个…

微信小程序图片裁剪功能的实现

文章目录 图片上传与处理图片尺寸适配图片显示与裁剪框裁剪框的拖动与缩放增加canvas并裁剪图片保存图片到相册总结 在之前的博文中&#xff0c;已经介绍了如何使用在前端开发中&#xff0c;实现较方便自由的图片裁剪功能&#xff0c;可见博文&#xff1a; 如何一步步实现图片…

直达CSDN——创作者创收

catalogue &#x1f31f; 写在前面&#x1f31f; 关于创收线下聚会&#x1f31f; 创作是最简单的变现模式&#x1f31f; 知识星球是否适合你&#x1f31f; 独自开-让开发变得简单&#x1f31f; 税/睡后收入&#x1f31f; KOL越具价值&#x1f31f; 期待创收组织的建立&#x1f…

MySQL数据库和Redis缓存一致性的更新策略

目录 专栏导读一、更新策略二、读写缓存1、同步直写策略2、异步缓写策略三、双检加锁策略四、数据库和缓存一致性的更新策略1、先更新数据库,再更新Redis2、先更新缓存,再更新数据库3、先删除缓存,再更新数据库延时双删4、先更新数据库,再删除缓存5、总结五、MySQL主从复制…

解密《永恒之塔私服》龙界要塞全貌

《永恒之塔2.0&#xff1a;进军龙界》将于12月29日14:00正式开放测试&#xff0c;全区全服29日起陆续更新&#xff0c;并将在元旦假期期间完成所有区服更新工作。12月27日&#xff0c;2.0新区抢先免费体验已经开始&#xff0c;凭特权激活码抢先免费体验无外挂《永恒之塔2.0》。…

Transformer通俗笔记:从Word2Vec、Seq2Seq逐步理解到GPT、BERT

前言 我在写上一篇博客《22下半年》时&#xff0c;有读者在文章下面评论道&#xff1a;“july大神&#xff0c;请问BERT的通俗理解还做吗&#xff1f;”&#xff0c;我当时给他发了张俊林老师的BERT文章&#xff0c;所以没太在意。 直到今天早上&#xff0c;刷到CSDN上一篇讲B…

TOGAF®10标准读书会首场活动圆满举办,精彩时刻回顾!

7月21日19:30pm&#xff0c;TOGAF10标准读书会线上系列活动-第一季首场活动圆满举办&#xff0c;读书会活动集聚了行业专家的力量&#xff0c;共同阅读、分享并结合自身实践&#xff0c;来讨论TOGAF标准第10版所阐释的内容。 首期读书会聚焦TOGAF标准第10版中的基本内容展开分享…

AI平台、AI中台架构

选择什么方式接入AI开放平台 1)公有云 形式:在开放平台注册账户,申请权限,调用对应AI能力的API服务 缺点:数据出公司域,存在数据安全 优点:价格相对低 2)私有化 形式:将AI能力以产品包的形式部署到客户的服务器上 缺点:需要后续运维支持、价格昂贵 优点:数据…

字节跳动|后端|提前批|一面+二面+三面+HR 面

一面&#xff5c;1h 自我介绍select、poll、epoll&#xff1f;epoll的两种触发模式&#xff1f;TCP三次握手过程&#xff0c;有什么状态&#xff0c;状态机如何变化&#xff1f;TCP握手的目的有哪些&#xff1f;什么是 TIME_WAIT 状态&#xff0c;为什么需要 TIME_WAIT 状态&a…

168张图,万字长文,手把手教你开发vue后台管理系统

“我报名参加金石计划1期挑战——瓜分10万奖池&#xff0c;这是我的第1篇文章&#xff0c;点击查看活动详情。” 我写这个项目的初衷一方面是为了记录自己自学 vue 的一个过程&#xff0c;另一方面是为了帮助小白快速掌握使用 vue 脚手架创建项目的一个完整过程。 本项目是一个…

STM32之ADC

目录 ADC介绍 ADC特性 ADC通道 ADC转换顺序 ADC触发方式 ADC转化时间 ADC转化模式 实验&#xff1a;使用ADC读取烟雾传感器的值 代码实现 ADC介绍 ADC 是什么&#xff1f; 全称&#xff1a; Analog-to-Digital Converter &#xff0c;指模拟 / 数字转换器 ADC的性能…

OpenCV安装配置教程VS2022(超级顺利)

前言 博主最开始没打算写这篇博客&#xff0c;只是想简单的在网上找一下最新版的OpenCV的安装配置教程&#xff0c;适用于VS2022的&#xff0c;但是我搜了一早上&#xff0c;也没搜到一个能让我成功安装配置的&#xff0c;看了很多很多文章&#xff0c;根本就没有几篇有用的。…

JavaEE三层架构

一. JavaEE三层架构 客户端&#xff1a;发送请求【http://ip:port/工程路径/资源路径】给服务器。 服务器&#xff1a;处理客户端的请求&#xff0c;把结果响应给客户端&#xff0c;由以下三部分组成 1.Web层&#xff08;SpringMVC&#xff09;包括&#xff1a;①使用Servlet…

微服务架构统一异常监控Sentry

Sentry 基本介绍简单使用Java项目应用代码侵入&#xff08;不建议&#xff0c;耦合性大&#xff09;全局拦截器捕获&#xff08;建议&#xff09;Lockback.xml 配置&#xff08;建议&#xff09; 基本介绍 Sentry 是一个开源的实时错误报告工具&#xff0c;支持 web 前后端、移…

《从零开始读懂Web3》读后感 之 Web 3.0的前世今生

介绍什么是 Web 3.0 &#xff08;Web3&#xff09;&#xff1f;网络的演变为什么 Web 3.0 很重要&#xff1f;Web 3.0 将如何运作&#xff1f;Web 3.0 的主要功能和技术Web 3.0 用例和应用程序Web 3.0 的潜在好处是什么&#xff1f;Web 3.0 的潜在挑战是什么&#xff1f;Web 3.…

【3】使用YOLOv8训练自己的目标检测数据集-【收集数据集】-【标注数据集】-【划分数据集】-【配置训练环境】-【训练模型】-【评估模型】-【导出模型】

在自定义数据上训练 YOLOv8 目标检测模型的步骤可以总结如下 6 步&#xff1a; &#x1f31f;收集数据集&#x1f31f;标注数据集&#x1f31f;划分数据集&#x1f31f;配置训练环境&#x1f31f;训练模型&#x1f31f;评估模型 1. 收集数据集 随着深度学习技术在计算机视觉领…

Windows安装mysql详细步骤(通俗易懂,简单上手)

文章目录 【确认本地是否安装mysql】【下载mysql安装包】【添加配置文件并安装mysql】【修改mysql密码】【配置环境变量】【总结】 前期在windows电脑尝试安装mysql&#xff0c;经历诸多不顺&#xff0c;特把安装详细步骤以及遇见的问题记录下来&#xff0c;提供给有需者使用。…

Java-Web前后端交互实现登陆注册(附源码)

1.完成用户登录功能。 2.完成注册功能。 3.主体利用Maven导入java中的jar包&#xff0c;使用Servlet实现前后端交互&#xff0c;使用mybatis以及注解&#xff0c;mysql进行数据保存&#xff0c;Tomcat服务器进行开发。 效果图 项目结构 代码 mapper(相对应注解) package com.it…

前端搭建砸地鼠游戏(内附源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分✨ 完整代码 ✨ 写在前面 上周我们实通过前端基础实现了打字通&#xff0c;当然很多伙伴再评论区提出了想法&#xff0c;后续我们会考虑实现的&#xff0c;今天还是继续按照我…