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

打印 上一主题 下一主题

主题 1777|帖子 1777|积分 5331

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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


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

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

  1. public class Singleton  
  2. {  
  3.     private static Singleton instance;  
  4.   
  5.     private Singleton() {}  
  6.   
  7.     public static Singleton Instance  
  8.     {  
  9.         get  
  10.         {  
  11.             if (instance == null)  
  12.             {  
  13.                 instance = new Singleton();  
  14.             }  
  15.             return instance;  
  16.         }  
  17.     }  
  18. }
复制代码
留意:上述实现在多线程环境下是不安全的,由于两个线程大概同时进入if (instance == null)判断,导致创建多个实例。
懒汉式(线程安全,双重检查锁定)

  1. public class Singleton  
  2. {  
  3.     private static volatile Singleton instance;  
  4.     private static readonly object lockObject = new object();  
  5.   
  6.     private Singleton() {}  
  7.   
  8.     public static Singleton Instance  
  9.     {  
  10.         get  
  11.         {  
  12.             if (instance == null)  
  13.             {  
  14.                 lock (lockObject)  
  15.                 {  
  16.                     if (instance == null)  
  17.                     {  
  18.                         instance = new Singleton();  
  19.                     }  
  20.                 }  
  21.             }  
  22.             return instance;  
  23.         }  
  24.     }  
  25. }
复制代码
留意:使用volatile关键字确保instance变量的读写操纵不会被编译器优化,同时使用双重检查锁定(Double-Checked Locking)模式来减少锁的使用,进步服从。
饿汉式

  1. public class Singleton  
  2. {  
  3.     private static readonly Singleton instance = new Singleton();  
  4.   
  5.     private Singleton() {}  
  6.   
  7.     public static Singleton Instance  
  8.     {  
  9.         get  
  10.         {  
  11.             return instance;  
  12.         }  
  13.     }  
  14. }
复制代码
留意:饿汉式在类加载时就完成了实例的初始化,因此是线程安全的,但它不是懒加载的,大概会浪费资源。
单例模式是一种非常有效的设计模式,但在实现时必要留意线程安全和资源利用的问题。在C#中,可以通过私有构造函数、私有静态变量和公共静态方法来实现单例模式,并根据具体需求选择懒汉式或饿汉式实现方式。
二、例子代码

用双重检查锁定的单例模式示例代码,同时展示如何在两个差别的线程中调用这个单例,一个线程用于不断写入数据,另一个线程用于不断读取并展示数据。
  1. using System;  
  2. using System.Threading;  
  3.   
  4. public class Singleton  
  5. {  
  6.     // 私有静态变量,volatile确保在多个线程中读取时不会被缓存  
  7.     private static volatile Singleton _instance;  
  8.     // 私有构造函数  
  9.     private Singleton()  
  10.     {  
  11.     }  
  12.   
  13.     // 公开的单例访问点  
  14.     public static Singleton Instance  
  15.     {  
  16.         get  
  17.         {  
  18.             if (_instance == null) // 第一次检查  
  19.             {  
  20.                 lock (typeof(Singleton)) // 锁定  
  21.                 {  
  22.                     if (_instance == null) // 第二次检查  
  23.                     {  
  24.                         _instance = new Singleton();  
  25.                     }  
  26.                 }  
  27.             }  
  28.             return _instance;  
  29.         }  
  30.     }  
  31.   
  32.     // 简单的数据成员,用于演示写入和读取  
  33.     public int Counter { get; set; }  
  34. }  
  35.   
  36. class Program  
  37. {  
  38.     static void Main(string[] args)  
  39.     {  
  40.         // 第一个线程:不断写入数据  
  41.         Thread writeThread = new Thread(() =>  
  42.         {  
  43.             while (true)  
  44.             {  
  45.                 Singleton singleton = Singleton.Instance;  
  46.                 singleton.Counter++;  
  47.                 // 为了看到效果,可以添加一些输出或延迟  
  48.                 Console.WriteLine($"Write Thread: Counter = {singleton.Counter}");  
  49.                 Thread.Sleep(100); // 简单的延迟  
  50.             }  
  51.         });  
  52.   
  53.         // 第二个线程:不断读取并展示数据  
  54.         Thread readThread = new Thread(() =>  
  55.         {  
  56.             while (true)  
  57.             {  
  58.                 Singleton singleton = Singleton.Instance;  
  59.                 // 读取并展示数据  
  60.                 Console.WriteLine($"Read Thread: Counter = {singleton.Counter}");  
  61.                 Thread.Sleep(200); // 稍微长一点的延迟,以便看到写入和读取的差异  
  62.             }  
  63.         });  
  64.   
  65.         // 启动两个线程  
  66.         writeThread.Start();  
  67.         readThread.Start();  
  68.   
  69.         // 注意:这里直接退出了主线程,但两个子线程会继续运行  
  70.         // 在实际应用中,你可能需要一种方式来优雅地停止这些线程  
  71.   
  72.         Console.WriteLine("Press any key to exit...");  
  73.         Console.ReadKey();  
  74.     }  
  75. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表