c# 单例模式 多线程
时间: 2023-07-25 11:48:32 浏览: 172
在 C# 中实现单例模式可以使用以下代码:
```csharp
public class Singleton
{
private static Singleton instance;
private static readonly object padlock = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
}
```
这里使用了双重检查锁定来确保线程安全。在访问 `Instance` 属性时,如果 `instance` 为 `null`,则在加锁的情况下创建一个新实例。由于加锁操作可能会影响性能,所以使用双重检查锁定来避免不必要的锁定。
相关问题
C# 单例模式,加锁实现多线程安全,给个示例代码
C# 中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。为了防止多线程环境下的并发问题,可以采用双重检查锁定(DCL)的方式来实现线程安全的单例。这种方式只有在第一次获取实例时才加锁,提高了效率。
以下是使用双重检查锁定的线程安全单例模式的示例代码:
```csharp
using System;
using System.Threading;
public 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;
}
}
}
// 示例如何使用:
Singleton myInstance = Singleton.Instance; // 只会创建一次
```
c# 单例模式的场景
单例模式是一种常见的设计模式,它可以确保一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式可以应用于以下场景:
1. 数据库连接池:在一个应用中,多个线程可能需要访问同一个数据库连接池,使用单例模式可以确保只有一个连接池实例存在,避免了资源浪费和线程安全问题。
2. 日志记录器:在一个应用程序中,多个模块可能需要记录日志,使用单例模式可以确保只有一个日志记录器实例存在,避免了日志记录的重复和冲突。
3. 配置文件管理器:在一个应用程序中,多个模块可能需要访问同一个配置文件,使用单例模式可以确保只有一个配置文件管理器实例存在,避免了配置文件的重复读取和冲突。
以下是一个用C#实现的单例模式示例:
```csharp
public class Singleton
{
private static Singleton instance = null;
private static readonly object padlock = new object();
private Singleton()
{
// Private constructor to prevent instantiation from outside the class
}
public static Singleton Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
}
```
阅读全文