C#单例模式与多线程用法介绍
单例模式是C#编程中最常用的面向对象设计模式之一,在多线程环境下实现单例模式要注意线程安全问题。本文将从以下几个方面进行介绍:
- 单例模式的概念及说明
- 单例模式的实现方式
- 多线程环境下的单例模式实现
- 示例代码介绍
单例模式概述
单例模式是指一个类只能被实例化一次,通过提供全局唯一的访问点,来确保该类的对象只有一个。单例模式在多线程环境下应用很广泛,因为多线程环境下创建多个实例可能会影响程序的稳定性和性能。
单例模式实现方式
在C#中实现单例模式有多种方式,这里介绍较为常用的两种实现方式。
方式一:饿汉模式
饿汉模式指的是在程序启动的时候就创建对象。这样做的好处是保证了对象的唯一性和线程安全,但也有一个缺点,就是如果对象很大或者创建起来很耗时,会导致程序启动时间变长。
示例代码如下:
public class Singleton
{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton GetInstance()
{
return instance;
}
}
方式二:懒汉模式
懒汉模式指的是在第一次访问的时候才创建对象。这种方式看起来更加灵活,但也有一个问题,就是在多线程环境下可能会导致创建多个实例的情况。为了避免这种情况,我们可以通过加锁或使用静态构造函数实现线程安全。
示例代码如下:
public class Singleton
{
private static Singleton instance = null;
private static readonly object obj = new object();
private Singleton(){}
public static Singleton GetInstance()
{
if(instance == null)
{
lock(obj)
{
if(instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
多线程环境下的单例模式实现
多线程环境下实现单例模式需要注意线程安全问题。常见的做法有使用静态构造函数或者加锁,这里以使用静态构造函数为例进行介绍。
示例代码如下:
public class Singleton
{
private static Singleton instance = null;
private static readonly object obj = new object();
private Singleton(){}
static Singleton()
{
instance = new Singleton();
}
public static Singleton GetInstance()
{
return instance;
}
}
在上面的示例代码中,使用了静态构造函数来保证线程安全。因为在类第一次被使用时,CLR会自动调用静态构造函数,只有一个线程会执行这个构造函数。
示例代码介绍
下面通过两个示例代码来说明单例模式的应用场景和使用方法。
示例一:Windows窗口
我们知道,在Windows操作系统中,每个窗口都有一个句柄,用于标识这个窗口。为了避免同一个窗口有多个句柄,Windows采用了单例模式来管理窗口的句柄。
示例代码如下:
public class Window
{
private static readonly object obj = new object();
private static Window instance = null;
private int handle;
private Window()
{
handle = GetWindowHandle();
}
public static Window GetInstance()
{
lock(obj)
{
if(instance == null)
{
instance = new Window();
}
}
return instance;
}
private int GetWindowHandle()
{
// 获取窗口句柄的代码
return handle;
}
}
示例二:日志记录器
在程序开发过程中,我们通常需要记录一些日志信息。为了确保日志信息写入的一致性,我们可以使用单例模式来实现日志记录器。
示例代码如下:
public class Logger
{
private static Logger instance = null;
private static readonly object obj = new object();
private StreamWriter writer = null;
private Logger()
{
string fileName ="log.txt";
writer = File.CreateText(fileName);
}
public static Logger GetInstance()
{
if(instance == null)
{
lock(obj)
{
if(instance == null)
{
instance = new Logger();
}
}
}
return instance;
}
public void WriteLog(string message)
{
writer.WriteLine("{0} - {1}", DateTime.Now.ToString(), message);
writer.Flush();
}
}
以上就是C#单例模式与多线程用法介绍的完整攻略。希望本文能对大家学习和使用单例模式有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#单例模式与多线程用法介绍 - Python技术站