单例模式及其应用

单例模式介绍:

单例模式是一种常见的设计模式,其目的是确保某个类只有一个实例存在,并提供一个全局访问点。

在实现单例模式时,一般需要注意以下几点:

  1. 私有化构造函数:防止外部直接实例化对象。
  2. 私有静态成员变量:用于保存唯一的实例。
  3. 公有静态方法:提供获取该实例的唯一访问点。
public class Singleton
{// 使用 readonly 关键字确保只能在类构造函数或声明时赋值private static readonly Singleton instance = new Singleton();// 私有构造函数,防止外部直接实例化private Singleton() {}// 公有静态属性,提供访问单例实例的唯一访问点public static Singleton Instance{get{return instance;}}
}

在这个示例中:

  1. Singleton 类的构造函数是私有的,这样就无法从外部直接实例化该类。
  2. instance 字段是 Singleton 类的静态成员,并且使用 readonly 关键字,确保只能在声明时或类的构造函数中赋值,这保证了在应用程序生命周期内只会创建一个实例。
  3. Instance 属性是该类的公有静态属性,用于返回 Singleton 类的唯一实例。由于 instance 字段是静态的,所以可以在该属性的 get 访问器中直接返回它。

这种实现方式是线程安全的,因为在 C# 中,静态字段在类加载时就会被初始化,保证了在多线程环境下只有一个实例被创建。

使用场景:

当需要确保系统中某个类只有一个实例存在,并且该实例需要在全局范围内被访问时,可以考虑使用单例模式。以下是一些具体的使用场景:

  1. 数据库连接池:在一个应用程序中,通常会频繁地与数据库交互,为了提高性能和资源利用率,可以使用单例模式来实现数据库连接池。这样可以确保只有一个数据库连接池实例被创建,所有的数据库连接请求都可以共享该实例,避免了频繁创建和销毁数据库连接的开销。

  2. 配置管理器:在应用程序中,可能会有许多需要共享的配置信息,例如数据库连接信息、日志记录级别等。使用单例模式可以确保只有一个配置管理器实例存在,所有的模块都可以通过该实例访问和修改配置信息,保证了配置信息的一致性和统一管理。

  3. 日志记录器:在应用程序中,需要记录各种事件、错误和调试信息以便于调试和跟踪。使用单例模式可以确保只有一个日志记录器实例存在,所有的模块都可以通过该实例将日志信息写入到同一个日志文件中,避免了多个日志实例导致的日志信息分散和不一致的问题。

  4. 线程池:在应用程序中,可能会有大量的任务需要并发执行,为了提高性能和资源利用率,可以使用单例模式来实现线程池。这样可以确保只有一个线程池实例被创建,所有的任务都可以提交到该实例中进行并发执行,避免了频繁创建和销毁线程的开销。

  5. 缓存管理器:在应用程序中,可能会有大量的数据需要缓存,为了提高性能和资源利用率,可以使用单例模式来实现缓存管理器。这样可以确保只有一个缓存管理器实例被创建,所有的数据都可以通过该实例进行缓存和访问,避免了多个缓存实例导致的数据冗余和一致性问题。

以下是一个简单的 C# 示例,演示了如何使用单例模式实现线程池:

在许多应用程序中,需要频繁地执行一些异步任务,例如处理网络请求、计算密集型任务等。为了有效地管理线程资源,可以使用线程池来重复利用线程,避免频繁创建和销毁线程所带来的开销。

using System;
using System.Collections.Generic;
using System.Threading;public class ThreadPoolManager
{private static ThreadPoolManager instance;private static readonly object lockObject = new object();private Queue<Action> tasks = new Queue<Action>();private bool isRunning = false;private ThreadPoolManager() { }public static ThreadPoolManager Instance{get{if (instance == null){lock (lockObject){if (instance == null){instance = new ThreadPoolManager();}}}return instance;}}public void AddTask(Action task){lock (tasks){tasks.Enqueue(task);if (!isRunning){isRunning = true;ThreadPool.QueueUserWorkItem(ProcessTasks);}}}private void ProcessTasks(object state){while (true){Action task = null;lock (tasks){if (tasks.Count > 0){task = tasks.Dequeue();}else{isRunning = false;break;}}task?.Invoke();}}
}

在这个示例中,ThreadPoolManager 类是一个单例类,通过 Instance 属性获取其唯一实例。该类包含一个任务队列 tasks,用于存储待执行的任务。

AddTask 方法用于向线程池中添加任务。当添加任务时,如果线程池当前没有在运行,则启动一个新的线程来处理任务队列中的任务。

ProcessTasks 方法是一个循环,用于从任务队列中取出任务并执行。当任务队列为空时,将 isRunning 标志设置为 false,退出循环。

现在,让我们来看看如何使用这个线程池:

class Program
{static void Main(string[] args){ThreadPoolManager threadPool = ThreadPoolManager.Instance;for (int i = 0; i < 10; i++){int taskNumber = i;threadPool.AddTask(() =>{Console.WriteLine($"Task {taskNumber} is executing on thread {Thread.CurrentThread.ManagedThreadId}");Thread.Sleep(1000); // 模拟任务执行时间});}}
}

在这个例子中,我们首先获取了 ThreadPoolManager 的唯一实例 threadPool,然后向线程池中添加了 10 个任务。每个任务都会打印一条消息,并模拟执行一段时间。由于线程池是单例的,因此所有的任务都会被提交到同一个线程池中进行处理。

这个示例展示了如何使用单例模式实现一个简单的线程池,用于管理异步任务的执行。

 

 

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

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

相关文章

微软ML Copilot框架释放机器学习能力

摘要&#xff1a;大模型席卷而来&#xff0c;通过大量算法模型训练推理&#xff0c;能根据人类输入指令产生图文&#xff0c;其背后是大量深度神经网络模型在做运算&#xff0c;这一过程称之为机器学习&#xff0c;本文从微软语言大模型出发&#xff0c;详解利用大型语言模型&a…

取得Claude模型的Key

目录 1.登录Claude \ Anthropic。需要美丽国IP。 2.取得Key 3.可用模型 4.帮助文档地址 5.使用这个key 6.取得Credit 1.登录Claude \ Anthropic。需要美丽国IP。 2.取得Key 3.可用模型 4.帮助文档地址 https://docs.anthropic.com/claude/docs/intro-to-claude --------…

前后端分离,使用sa-token作为安全框架快速搭建一个微服务项目

之前写过一个单体项目&#xff0c;现在想把它升级为微服务项目。在拆分升级的过程中发现了很多问题&#xff0c;本次就来记录一下遇到的问题和解决方法。&#xff08;这篇文章只是记录一下拆分项目的基础架构&#xff0c;并使用sa-token做微服务项目的安全框架&#xff0c;快速…

upload-labs后续(14-)

图片马 在图片中加入木马&#xff0c;然后上传让浏览器解析&#xff0c;达到上传木马的目的 制作图片马&#xff1a;可以在notepad或者winhex中打开文件&#xff0c;在文件头中加入图片的文件头&#xff0c;再在文件末尾加入木马即可。 图片文件头如下&#xff1a; 1.Png图片…

学生党学习亚马逊云科技AWS、求职上岸就申AWS Cloud Club队长!

毕业了怎么找工作&#xff1f;该怎么学AWS&#xff1f;这是同学们最关心的问题。最近AWS推出的Cloud Club校园社区计划就可以完美解决这些问题&#xff01; &#x1f3eb;AWS校园社区计划是在学校构建校园社团(全球学校)&#xff0c;带着大家学最热的开发、AI/ML技术&#xff0…

IDEA主题美化【保姆级】

前言 一款好的 IDEA 主题虽然不能提高我们的开发效率&#xff0c;但一个舒适简单的主题可以使开发人员更舒适的开发&#xff0c;时常换一换主题可以带来不一样的体验&#xff0c;程序员的快乐就这么简单。话不多说&#xff0c;先上我自己认为好看的主题设置。 最终效果图: 原…

《机器学习by周志华》学习笔记-线性模型-03

1、多分类学习 1.1、背景 我们在上一节介绍了「线性判别分析(LDA)」,LDA的从二分类任务可以推广到多分类任务中。 而现实中常遇到的多分类学习任务。有些二分类的学习方法可以直接推广到多分类,但是更多情况下是基于一些策略,利用二分类学习器来解决多分类的问题。 1.…

41 对MVC,MVP,MVVM的理解

对MVC&#xff0c;MVP&#xff0c;MVVM的理解 三者都是项目的架构模式(不是类的设计模式)&#xff0c;即:一个项目的结构&#xff0c;如何分层&#xff0c;不同层负责不同的职责。 1、MVC: MVC的出现是用在后端(全栈时代) M:model&#xff0c;模型: 主要完成业务功能&#xff0…

C语言真题20套

第一套 一.选择题 1.下列正确的标识符是(C ). A、ab B、6a C、_do D、%y 2.执行以下程序段后&#xff0c;输出结果和a的值是&#xff08;B&#xff09;。 int a10; printf(“%d”,a); A、11 和 10 B、10 和 11 C、11 和 11 D、10 和 10 3.以下不正确的if语句形式是&#xf…

OpenVINO安装教程 Docker版

从 Docker 映像安装IntelDistribution OpenVINO™ 工具套件 本指南介绍了如何使用预构建的 Docker 镜像/手动创建镜像来安装 OpenVINO™ Runtime。 Docker Base 映像支持的主机操作系统&#xff1a; Linux操作系统 Windows (WSL2) macOS(仅限 CPU exectuion) 您可以使用预…

机器学习作业3____决策树(CART算法)

目录 一、简介 二、具体步骤 样例&#xff1a; 三、代码 四、结果 五、问题与解决 一、简介 CART&#xff08;Classification and Regression Trees&#xff09;是一种常用的决策树算法&#xff0c;可用于分类和回归任务。这个算法由Breiman等人于1984年提出&#xff0c;它…

如何让Ubuntu上的MySQL开发更便捷

前言 作为一款开源的数据库开发与数据库管理协同工具&#xff0c;&#xff08;OceanBase Developer Center&#xff0c;简称ODC&#xff09;&#xff0c;针对MySQL数据源&#xff0c;已提供了涵盖SQL开发、变更风险管控、数据安全合规等多个方面的功能&#xff0c;从而为MySQL…

解决生产环境突然报错“Kibana server is not ready yet‘’

问题描述&#xff1a; 在生产环境上用docker-compose部署好ElasticSearch 和Kibana后&#xff08;ElasticSearch基础用法-CSDN博客&#xff09;&#xff0c;Kibana上进行数据的增、删、改、查很是方便&#xff0c;但突然有一天在浏览器上打开kibana地址&#xff0c;提示‘Kiba…

新媒体运营-----短视频运营-----PR视频剪辑----视频调色

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1. Lumetri调色&#xff0c;明暗对比度2. Lumetri调色&#xff0c;创意与矢量示波器2.1 创意2.2 矢量示波器 3. L…

英文单词收集

solubility:【化】溶(解)度&#xff1b;(可)溶性&#xff1b;可解释性 a rewarding playground:值得做的&#xff1b;有益的&#xff1b;报酬高的 With the advent of:随着…的出现&#xff1b;随着某物的出现&#xff1b;随着…的到来 optical tweezers:光镊&#xff1b;光学镊…

视频美颜SDK与主播美颜工具的技术原理与应用场景分析

在直播视频领域中&#xff0c;视频美颜SDK和主播美颜工具发挥着至关重要的作用。本文将探讨这些工具的技术原理及其在不同应用场景中的应用。 一、视频美颜SDK的技术原理 1.1 图像处理技术 视频美颜SDK的核心技术之一是图像处理技术。根据用户设定的美颜参数进行相应的调整。…

Meta Llama 3 性能提升与推理服务部署

利用 NVIDIA TensorRT-LLM 和 NVIDIA Triton 推理服务器提升 Meta Llama 3 性能 我们很高兴地宣布 NVIDIA TensorRT-LLM 支持 Meta Llama 3 系列模型&#xff0c;从而加速和优化您的 LLM 推理性能。 您可以通过浏览器用户界面立即试用 Llama 3 8B 和 Llama 3 70B&#xff08;该…

SpringBoot 快速开始 Dubbo RPC

文章目录 SpringBoot 快速开始 Dubbo RPC下载 Nacos项目启动项目的创建创建主项目接口定义服务的创建Dubbo 服务提供者的创建服务的消费者创建 添加依赖给 Provider、Consumer 添加依赖 开始写代码定义接口在 Provider 中实现在 Consumer 里面使用创建启动类 注册中心配置启动 …

YOKOGAWA横河手操器维修hart通讯器YHC5150X-01

横河手操器设置注意事项&#xff1a;内藏指示计显示选择与单位设置 有如下 5 种显示模式及单位设置百分比显示、用户设置显示、用户设置和百分比交替显示、输入压力显示、输入压力和百分比交替显示。即应用在当没有输入时操作要求输出为20mA引压方向设置右/左侧高压&#xff0c…

Docker容器:数据管理与镜像的创建(主要基于Dockerfile)

目录 一、Docker 数据管理 1、数据卷&#xff08;Data Volumes&#xff09; 2、数据卷容器&#xff08;DataVolumes Containers&#xff09; 二、容器互联&#xff08;使用centos镜像&#xff09; 三、Docker 镜像的创建 1、基于现有镜像创建 2、基于本地模板创建 3、基…