C#单例模式实现解析与性能对比分析
171 浏览量
更新于2024-09-03
收藏 85KB PDF 举报
本文主要探讨了C#编程语言中单例模式的实现方式以及不同实现之间的性能比较。单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。在C#中,由于可能存在多线程环境,因此实现单例时需要考虑线程安全问题。文章详细列举了6种不同的实现策略,分析了各自的优缺点。
1. 非线程安全实现
这是最简单但不推荐的实现方式,通过检查实例是否为null来决定是否创建新的实例。这种方式在多线程环境下会导致线程竞争,可能创建多个实例。
```csharp
public sealed class Singleton
{
private static Singleton instance = null;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
```
2. 简单的线程安全实现
通过使用锁(lock)语句确保在多线程环境下只创建一个实例。这种实现是线程安全的,但可能导致阻塞,影响性能。
```csharp
public sealed class Singleton
{
private static Singleton instance = null;
private static readonly object padlock = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
}
return instance;
}
}
}
```
3. 双重检查锁定(Double-Check Locking)
这是一种优化的线程安全实现,减少锁的使用时间,提高并发性能。
```csharp
public sealed class Singleton
{
private static volatile Singleton instance;
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;
}
}
}
```
4. 静态内部类实现
通过内部类确保单例的延迟初始化和线程安全性,因为内部类的加载是线程安全的。
```csharp
public sealed class Singleton
{
private Singleton() { }
public static Singleton Instance => Nested.instance;
private static class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested() { }
internal static readonly Singleton instance = new Singleton();
}
}
```
5. 基于`Lazy<T>`的实现
.NET Framework 4.0引入了`Lazy<T>`类型,提供了线程安全的延迟初始化。
```csharp
public sealed class Singleton
{
private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());
private Singleton() { }
public static Singleton Instance => lazy.Value;
}
```
6. 使用`System.Runtime.CompilerServices.SingletonAttribute`(C# 9.0及以上版本)
C# 9.0引入了SingletonAttribute,可以与编译器配合实现线程安全的单例。
```csharp
[Singleton]
public sealed class Singleton
{
private Singleton() { }
}
```
每种实现方式都有其适用场景和优缺点。例如,非线程安全实现简单但不适用于多线程环境;简单线程安全实现保证了线程安全但可能造成性能损失;双重检查锁定、静态内部类和`Lazy<T>`实现了线程安全和延迟初始化;而C# 9.0的SingletonAttribute则利用编译器支持简化了代码。开发者在选择实现方式时应根据项目需求、性能要求以及兼容性来决定。
2010-03-12 上传
2021-01-21 上传
2018-09-09 上传
点击了解资源详情
点击了解资源详情
2014-06-14 上传
2009-12-07 上传
weixin_38696336
- 粉丝: 3
- 资源: 921
最新资源
- SSM Java项目:StudentInfo 数据管理与可视化分析
- pyedgar:Python库简化EDGAR数据交互与文档下载
- Node.js环境下wfdb文件解码与实时数据处理
- phpcms v2.2企业级网站管理系统发布
- 美团饿了么优惠券推广工具-uniapp源码
- 基于红外传感器的会议室实时占用率测量系统
- DenseNet-201预训练模型:图像分类的深度学习工具箱
- Java实现和弦移调工具:Transposer-java
- phpMyFAQ 2.5.1 Beta多国语言版:技术项目源码共享平台
- Python自动化源码实现便捷自动下单功能
- Android天气预报应用:查看多城市详细天气信息
- PHPTML类:简化HTML页面创建的PHP开源工具
- Biovec在蛋白质分析中的应用:预测、结构和可视化
- EfficientNet-b0深度学习工具箱模型在MATLAB中的应用
- 2024年河北省技能大赛数字化设计开发样题解析
- 笔记本USB加湿器:便携式设计解决方案