C# 单例模式的实现原理,并请用代码详细备注下
时间: 2024-10-25 14:12:06 浏览: 20
单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。C#中实现单例有几种常见的方法:
1. **懒汉式**(线程不安全的简单实现):
```csharp
public class Singleton
{
private static Singleton _instance; // 单例实例
private Singleton() {} // 构造函数私有化,防止外部直接创建
public static Singleton Instance
{
get { return _instance ?? (_instance = new Singleton()); } // 双重检查锁定优化
}
}
```
这里通过`Instance`属性获取单例实例,如果`_instance`为null,则初始化一个新的实例并将其赋值给`_instance`。注意,这种实现方式在多线程环境下可能会有问题,因为如果两个线程同时检测到 `_instance` 为空并且同时去创建新的实例,就会有两个实例。
2. **饿汉式**(预加载式,线程安全):
```csharp
public sealed class Singleton
{
private static readonly Singleton _instance = new Singleton(); // 在类加载时就创建了实例
private Singleton() {} // 私有构造函数
public static Singleton Instance
{
get { return _instance; }
}
}
```
这个版本在类加载时就创建了实例,所以无论何时请求,都能立即得到,而且它是线程安全的,因为实例在一开始就存在。
3. **使用`Lazy<T>`**(延迟加载,线程安全):
```csharp
using System.Lazy;
public sealed class Singleton
{
private static readonly Lazy<Singleton> _lazyInstance = new Lazy<Singleton>(() => new Singleton()); // 延迟初始化
private Singleton() {}
public static Singleton Instance
{
get { return _lazyInstance.Value; }
}
}
```
`Lazy<T>`会在第一次访问时才真正创建实例,并且确保后续的并发访问都是同一个实例。
阅读全文