当前位置: 首页 > news >正文

WPF界面开发-C#单例模式实现 页面数据传输

单例模式(Singleton Pattern)是一种常用的软件设计模式,用于确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。在C#中,单例模式非常有用,特别是在需要管理共享资源访问(如数据库连接、配置文件读取器等)时。

一、单例模式介绍

实现单例模式的几个关键点:

  1. 私有构造函数:防止外部代码通过new关键字创建类的实例。
  2. 私有静态变量:用于存储类的唯一实例。
  3. 公共静态方法:提供一个全局访问点来获取类的唯一实例,如果实例不存在则创建它。

线程安全的单例模式实现

在多线程环境下,单例模式的实现需要确保线程安全,以防止多个线程同时创建实例。

懒汉式(线程不安全)
public class Singleton  
{  private static Singleton instance;  private Singleton() {}  public static Singleton Instance  {  get  {  if (instance == null)  {  instance = new Singleton();  }  return instance;  }  }  
}

注意:上述实现在多线程环境下是不安全的,因为两个线程可能同时进入if (instance == null)判断,导致创建多个实例。

懒汉式(线程安全,双重检查锁定)
public class Singleton  
{  private static volatile Singleton instance;  private static readonly object lockObject = new object();  private Singleton() {}  public static Singleton Instance  {  get  {  if (instance == null)  {  lock (lockObject)  {  if (instance == null)  {  instance = new Singleton();  }  }  }  return instance;  }  }  
}

注意:使用volatile关键字确保instance变量的读写操作不会被编译器优化,同时使用双重检查锁定(Double-Checked Locking)模式来减少锁的使用,提高效率。

饿汉式
public class Singleton  
{  private static readonly Singleton instance = new Singleton();  private Singleton() {}  public static Singleton Instance  {  get  {  return instance;  }  }  
}

注意:饿汉式在类加载时就完成了实例的初始化,因此是线程安全的,但它不是懒加载的,可能会浪费资源。

单例模式是一种非常有用的设计模式,但在实现时需要注意线程安全和资源利用的问题。在C#中,可以通过私有构造函数、私有静态变量和公共静态方法来实现单例模式,并根据具体需求选择懒汉式或饿汉式实现方式。

二、例子代码

用双重检查锁定的单例模式示例代码,同时展示如何在两个不同的线程中调用这个单例,一个线程用于不断写入数据,另一个线程用于不断读取并展示数据。

using System;  
using System.Threading;  public class Singleton  
{  // 私有静态变量,volatile确保在多个线程中读取时不会被缓存  private static volatile Singleton _instance;  // 私有构造函数  private Singleton()  {  }  // 公开的单例访问点  public static Singleton Instance  {  get  {  if (_instance == null) // 第一次检查  {  lock (typeof(Singleton)) // 锁定  {  if (_instance == null) // 第二次检查  {  _instance = new Singleton();  }  }  }  return _instance;  }  }  // 简单的数据成员,用于演示写入和读取  public int Counter { get; set; }  
}  class Program  
{  static void Main(string[] args)  {  // 第一个线程:不断写入数据  Thread writeThread = new Thread(() =>  {  while (true)  {  Singleton singleton = Singleton.Instance;  singleton.Counter++;  // 为了看到效果,可以添加一些输出或延迟  Console.WriteLine($"Write Thread: Counter = {singleton.Counter}");  Thread.Sleep(100); // 简单的延迟  }  });  // 第二个线程:不断读取并展示数据  Thread readThread = new Thread(() =>  {  while (true)  {  Singleton singleton = Singleton.Instance;  // 读取并展示数据  Console.WriteLine($"Read Thread: Counter = {singleton.Counter}");  Thread.Sleep(200); // 稍微长一点的延迟,以便看到写入和读取的差异  }  });  // 启动两个线程  writeThread.Start();  readThread.Start();  // 注意:这里直接退出了主线程,但两个子线程会继续运行  // 在实际应用中,你可能需要一种方式来优雅地停止这些线程  Console.WriteLine("Press any key to exit...");  Console.ReadKey();  }  
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C语言程序设计-[11] 循环结构嵌套
  • uniapp 对于scroll-view滑动和页面滑动的联动处理
  • 什么是前端微服务,有何优势
  • 解决戴尔台式电脑休眠后无法唤醒问题
  • JS中关于为什么调用构造函数要使用new的详细解读
  • stm32程序调试方式(OLED显示屏调试以及Keil调试模式)
  • lwip 3. 网线拔掉后 lwip_recvfrom不能返回
  • ECMAScript 6 入门 学习 日志笔记 2024/8/6 13:59
  • 【Transformer】关于RNN以及transformer的相关介绍
  • uniapp3.0实现图片上传公用组件上传uni-file-picker,uni.uploadFile
  • Mac电脑装不了软件怎么办 苹果电脑软件安装失败解决办法 安装macos空间不足
  • 【开源社区】Elasticsearch(ES)中空值字段 null_value 及通过exists查找非空文档
  • 【MySQL】全面剖析索引失效、回表查询与索引下推
  • 【开端】web系统中返回状态码组织管理
  • 回顾Python
  • 【React系列】如何构建React应用程序
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 2018一半小结一波
  • Bytom交易说明(账户管理模式)
  • codis proxy处理流程
  • FineReport中如何实现自动滚屏效果
  • Java基本数据类型之Number
  • java中具有继承关系的类及其对象初始化顺序
  • js操作时间(持续更新)
  • js如何打印object对象
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Mysql5.6主从复制
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Twitter赢在开放,三年创造奇迹
  • 阿里云购买磁盘后挂载
  • 分布式任务队列Celery
  • 技术胖1-4季视频复习— (看视频笔记)
  • 前端设计模式
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用API自动生成工具优化前端工作流
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 微信小程序开发问题汇总
  • 物联网链路协议
  • 学习使用ExpressJS 4.0中的新Router
  • 移动端 h5开发相关内容总结(三)
  • 异步
  • 移动端高清、多屏适配方案
  • ​​​​​​​​​​​​​​Γ函数
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #stm32驱动外设模块总结w5500模块
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (分布式缓存)Redis持久化
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐