单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。单例模式有多种实现方式,在 C# 中,单例模式有多种实现方式。
尽管在.NETCore中已经内置了Ioc容器,容器可以确保
1、饿汉式
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
// 私有构造函数,防止外部实例化
private Singleton() { }
public static Singleton Instance
{
get
{
return instance;
}
}
}
这是最简单的单例模式,巧妙利用C#中static静态变量全局只能被初始化一次的机制来创建当前类的实例对象,确保线程安全。这也是我最喜欢的一种实现方式,尽管大部分人认为这种写法可能会有一些性能上的损失,创建对象耗时较长。但是我个人认为在当前的硬件性能环境下,这些损失几乎可以忽略不计。
2、懒汉式(双重检查锁定)
public sealed class Singleton
{
private static Singleton instance = null;
private static readonly object padlock = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
这种方式确保只有在第一次使用的时候,才创建实例对象,if双重判定和lock锁可以确保线程安全。即使并发执行,也只会创建一个实例对象。
双重检查既可以确保访问的高效,又可以保证线程安全。
3、静态构造函数
public sealed class Singleton
{
private static readonly Singleton instance;
// 私有构造函数,防止外部实例化
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
静态构造函数在整个应用程序生命周期只会执行一次,所以利用这个机制。可以在静态构造函数中,来构造类的唯一实例对象。线程的安全,交给运行来确保,我们不需要下像懒汉式那样通过锁来保证线程安全。
4、Lazy<T>懒加载
public sealed class Singleton
{
private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());
private Singleton() { }
public static Singleton Instance
{
get
{
return lazy.Value;
}
}
}
Lazy<T> 提供了一种更优雅的方式来实现单例模式,具有以下优点:
1. 延迟初始化:Lazy<T> 实例在第一次访问时才会被创建,这样可以避免不必要的资源消耗。
2. 线程安全:Lazy<T> 默认是线程安全的,确保在多线程环境下也能正确地创建单例实例。
3. 简洁性:使用 Lazy<T> 可以简化代码,不需要显式地编写双重检查锁定等复杂的线程同步代码。