多线程Singleton单件模式收藏
Singleton模式是最简单的模式,比较汗颜的是自己一直以来使用的是单线程的Singleton模式,最近在听了李建忠老师的模式讲座录像后,才发现自己一直没注意到这点。这个录像讲座在后面给出了链接地址: C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)
下面内容整理自李建忠老师的讲课内容:
单线程的Singleton模式
public class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
}要点:
Singleton模式中的实例构造器可以设置为protected以允许子类派生。
Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样跟Singleton模式的初衷违背。
Singleton模式只考虑到了对象创建的管理,并没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没必要对其销毁进行特殊的管理。
上述代码不支持多线程环境,上述代码在多线程下,仍然有可能得到Singleton类的多个实例。
多线程的Singleton模式
public class Singleton
{
private static volatile Singleton instance = null;
private static object lockHelper = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (lockHelper)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}代码说明:
volatile C#关键字作用,简单来说,编译器编译我们的代码时候,会对代码作一些优化,进而对代码进行了微调,使用volatile关键字就可以避免这个微调。继而严格意义上保证不会产生多线程。更详细的关于volatile 的说明,请看参考资料。
双检查加锁模式。在lock之外和之内,我们做了instance是否为空的检查。这叫双检查。因为同步控制的时间太长了。双检查能够最高效地实现多线程安全的访问。
使用.net特有的支持多线程的单件模式代码
public sealed class Singleton
{
public static readonly Singleton Instance = new Singleton();
private Singleton() { }
}代码说明:
sealed 修饰符表示该类是密封类,不能被继承。你可以按需修改。
这里readonly关键字只是不希望客户程序将Instance字段设置为null等不合理的值。
*** static *** = new Singleton(); 是使用了内联初始化技术,这部分初始化其实是在static Singleton()中执行的。即上面的代码相当于:
public sealed class Singleton
{
public static readonly Singleton Instance;
static Singleton()
{
Instance = new Singleton();
}
private Singleton() { }
}上述代码在编译时,会使用一个名为beforefieldinit元数据标志。此标志使得运行库能够在任何时候执行类型构造函数方法,只要该方法在第一次访问该类型的静态字段之前执行即可。换句话说,beforefieldinit 为运行库提供了一个执行主动优化的许可。如果没有 beforefieldinit,运行库就必须在某个精确时间运行类型构造函数,即,恰好在第一次访问该类型的静态或实例字段和方法之前。
静态构造器自身就可以保证,多线程情况下,系统就可以保证只有一个执行。
缺点:
不支持参数化单件构造器。即静态构造器不支持参数,就导致我们无法利用静态构造器实现传参数的单件。
分享到:
相关推荐
在提供的"1.Singleton 单件(创建型模式).wmv"视频文件中,可能详细讲解了Singleton模式的概念、实现方式、优缺点以及在C#中的具体应用实例,包括如何在实际项目中适当地使用和避免滥用Singleton模式。观看该视频可以...
- 在多线程环境下,我们需要确保多个线程访问Singleton的`Instance`属性时不会创建多个实例。这里使用了`volatile`关键字来解决内存可见性和指令重排序问题,确保所有线程都能看到最新的 `_instance` 值。 - `lock...
### 单件模式(Singleton Pattern)详解 #### 概述 单件模式是软件设计模式中最为基础且应用广泛的一种模式。它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。此模式通常用于那些需要频繁创建、消耗...
标题和描述均聚焦于"C#面向对象设计模式"之中的"Singleton单件(创建型模式)",这是一种在软件工程领域广泛运用的设计模式,其核心在于确保一个类只有一个实例,并提供一个全局访问点,以实现资源的有效管理和控制。...
这种方式在多线程环境下很有用,但不是传统的 Singleton 模式。 了解 Singleton 模式后,我们需要注意它的一些潜在问题。Singleton 可能导致系统的耦合度增加,因为它全局可访问,可能导致测试困难。此外,如果 ...
单件模式(Singleton Pattern)是设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在软件开发中被广泛应用,比如配置管理、数据库连接池、日志服务等场景,需要确保全系统...
**单例模式(Singleton)**是软件设计模式中的一种创建型模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,例如管理共享资源、配置对象或者数据库连接等。单例...
单件模式(Singleton pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,如日志服务、线程池或者数据库连接等...
但这种实现方式在多线程环境下可能导致多个线程同时创建实例,破坏了Singleton的唯一性。 ```csharp public class Singleton { private static Singleton instance; private Singleton() {} public static...
单件模式(Singleton Pattern)是设计模式中的一种,它的核心意图是确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,这样的设计模式能够有效地控制资源的使用,限制实例的数量,以及协调对象间的交互...
这段代码中,`volatile`关键字确保了多线程环境下的正确性,`lock`语句则用于线程同步,防止多个线程同时创建实例。 2. **饿汉式(Eager Initialization)**:在类加载时就完成初始化,确保任何时候都只有一个实例...
单件模式(Singleton Pattern)是设计模式中的一种结构型模式,它的主要目的是保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,例如日志服务、线程池、数据库连接等...
在多线程环境下,既保证了线程安全,又避免了同步带来的性能问题。 ```java public class Singleton { private volatile static Singleton INSTANCE; private Singleton() {} public static Singleton ...
单件模式(Singleton Pattern)是软件设计模式中的一种基础模式,它确保一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式的实现有多种方式,包括懒汉式、饿汉式以及线程安全的实现。下面我们将详细讨论...
单件模式(Singleton Pattern)是软件设计模式中最基础且常用的一种模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制实例化过程或者资源管理的场景中尤其适用,例如日志服务...
但这种方式线程不安全,可能会在多线程环境下创建多个实例。 ```csharp public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton Instance { get { ...
- **双重检查锁定**:在多线程环境下,确保线程安全的同时提高效率。 **4. 示例代码** 这里以懒汉式为例简要说明单例模式的实现: ```cpp class Singleton { private: static Singleton* instance; Singleton()...
- 优点:避免了多线程下的同步问题,提高了运行效率。 - 缺点:可能会造成资源浪费,尤其是在实例创建成本较高时。 #### 四、单件模式的应用场景 1. **日志对象**:单例模式可以用于管理全局的日志记录器,确保...