`
jetway
  • 浏览: 485869 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

多线程Singleton单件模式收藏

    博客分类:
  • java
阅读更多
多线程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,运行库就必须在某个精确时间运行类型构造函数,即,恰好在第一次访问该类型的静态或实例字段和方法之前。
静态构造器自身就可以保证,多线程情况下,系统就可以保证只有一个执行。
缺点:

不支持参数化单件构造器。即静态构造器不支持参数,就导致我们无法利用静态构造器实现传参数的单件。
分享到:
评论

相关推荐

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    在提供的"1.Singleton 单件(创建型模式).wmv"视频文件中,可能详细讲解了Singleton模式的概念、实现方式、优缺点以及在C#中的具体应用实例,包括如何在实际项目中适当地使用和避免滥用Singleton模式。观看该视频可以...

    C#多线程Singleton(单件)模式模板

    - 在多线程环境下,我们需要确保多个线程访问Singleton的`Instance`属性时不会创建多个实例。这里使用了`volatile`关键字来解决内存可见性和指令重排序问题,确保所有线程都能看到最新的 `_instance` 值。 - `lock...

    C++设计模式课件12_Singleton_单件模式.pdf

    ### 单件模式(Singleton Pattern)详解 #### 概述 单件模式是软件设计模式中最为基础且应用广泛的一种模式。它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。此模式通常用于那些需要频繁创建、消耗...

    C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)

    标题和描述均聚焦于"C#面向对象设计模式"之中的"Singleton单件(创建型模式)",这是一种在软件工程领域广泛运用的设计模式,其核心在于确保一个类只有一个实例,并提供一个全局访问点,以实现资源的有效管理和控制。...

    Singleton 单件(创建型模式)

    这种方式在多线程环境下很有用,但不是传统的 Singleton 模式。 了解 Singleton 模式后,我们需要注意它的一些潜在问题。Singleton 可能导致系统的耦合度增加,因为它全局可访问,可能导致测试困难。此外,如果 ...

    c++实现单件模式 c++实现单件模式 c++实现单件模式

    单件模式(Singleton Pattern)是设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在软件开发中被广泛应用,比如配置管理、数据库连接池、日志服务等场景,需要确保全系统...

    [创建型模式] head first 设计模式之单件模式(Singleton)

    **单例模式(Singleton)**是软件设计模式中的一种创建型模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,例如管理共享资源、配置对象或者数据库连接等。单例...

    Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现

    单件模式(Singleton pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,如日志服务、线程池或者数据库连接等...

    C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) (Level 300)

    但这种实现方式在多线程环境下可能导致多个线程同时创建实例,破坏了Singleton的唯一性。 ```csharp public class Singleton { private static Singleton instance; private Singleton() {} public static...

    设计模式 之 单件模式

    单件模式(Singleton Pattern)是设计模式中的一种,它的核心意图是确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,这样的设计模式能够有效地控制资源的使用,限制实例的数量,以及协调对象间的交互...

    C#面向对象设计模式纵横谈(2)Singleton 单件(创建型模式)

    这段代码中,`volatile`关键字确保了多线程环境下的正确性,`lock`语句则用于线程同步,防止多个线程同时创建实例。 2. **饿汉式(Eager Initialization)**:在类加载时就完成初始化,确保任何时候都只有一个实例...

    单件模式试做--static的使用

    单件模式(Singleton Pattern)是设计模式中的一种结构型模式,它的主要目的是保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,例如日志服务、线程池、数据库连接等...

    设计模式之单件模式

    在多线程环境下,既保证了线程安全,又避免了同步带来的性能问题。 ```java public class Singleton { private volatile static Singleton INSTANCE; private Singleton() {} public static Singleton ...

    基于C#的设计模式中的单件模式

    单件模式(Singleton Pattern)是软件设计模式中的一种基础模式,它确保一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式的实现有多种方式,包括懒汉式、饿汉式以及线程安全的实现。下面我们将详细讨论...

    单件模式源代码

    单件模式(Singleton Pattern)是软件设计模式中最基础且常用的一种模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制实例化过程或者资源管理的场景中尤其适用,例如日志服务...

    C#设计模式,单件模式,C#代码

    但这种方式线程不安全,可能会在多线程环境下创建多个实例。 ```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. **日志对象**:单例模式可以用于管理全局的日志记录器,确保...

Global site tag (gtag.js) - Google Analytics