zoukankan      html  css  js  c++  java
  • .net中的设计模式---单例模式,涉及lock的用法

    单例模式代码

    1、单例模式类Singleton

    public class Singleton

    {

        private static Singleton instance;

     

        /// <summary>

        /// 程序运行时,创建一个静态只读的进程辅助对象

        /// </summary>

        private static readonly object _object = new object();

     

        /// <summary>

        /// 构造方法私有,外键不能通过New类实例化此类

        /// </summary>

        private Singleton()

        {

        }

        /// <summary>

        /// 此方法是本类实例的唯一全局访问点

        /// (双重加锁 Double-Check Locking

        /// </summary>

        /// <returns></returns>

        public static Singleton GetInstance()

        {

            //先判断实例是否存在,不存在再加锁处理

            if (instance == null)

            {

                //在同一时刻加了锁的那部分程序只有一个线程可以进入,

                lock (_object)

                {

                    //如实例不存在,则New一个新实例,否则返回已有实例

                    if (instance == null)

                    {

                        instance = new Singleton();

                    }

                }

            }

            return instance;

        }

    }

     

    2、客户端代码

    static void Main(string[] args)

    {

        Singleton singleton2 = Singleton.GetInstance();

        Singleton singleton3 = Singleton.GetInstance();

        if (singleton2 ==singleton3)

        {

            Console.WriteLine("实例singleton2与实例singleton3相同!");

        }

        Console.ReadKey();

    }

     

    问题描述:


     

            单例模式 Singleton Pattern


     

    问题解决:


     

    (1)单例模式简介:


     

    Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任。


     

    单例模式特点:


     

        (1.1)一个类有且仅有一个实例


     

        (1.2)类提供一个全局的访问点


     

            (2)单例模式的实现:


     

    (2.1)简单实现:


     

    clipboard


     

    上述实现的优点:


     

             
    (1)直到对象要求时,才进行实例的初始化,这种实现方法称为:“惰性实例化”,惰性实例化,避免了程序启动时创建不必要的Singleton。


     

    上述实现的缺点:


     

              
    (1)这种实现对于多线程环境并不安全,可能实例化多个对象,例如可能存在两个线程进行instance==null的判断,然后创建两个单例对象,这就违背了单例模式的设计意图。


     

        (2.2)安全的线程:


     

    clipboard


     

    以上的实现保证了单例对象在多线程的情况下只会创建一个,但是padlock增加了额外的开销


     

        (2.3)双重锁定


     

    clipboard


     

           
    这种实现方式对多线程来说是安全的,同时线程不是每次都加锁,只有判断对象实例没有被创建时它才加锁,有了我们上面第一部分的里面的分析,我们知道,加锁后还得再进行对象是否已被创建的判断。它解决了线程并发问题,同时避免在获取
    Instance
    的调用中都出现独占锁定。它还允许您将实例化延迟到第一次访问对象时发生。实际上,应用程序很少需要这种类型的实现。大多数情况下我们会用静态初始化。这种方式仍然有很多缺点:无法实现延迟初始化。


     

    (2.4)静态初始化


     

    clipboard


     

            此实现中,将在第一次引用类的任何成员创建实例,该类标记为 sealed 以阻止发生派生,而派生可能会增加实例。此外,变量标记为
    readonly,这意味着只能在静态初始化期间(此处显示的示例)或在类构造函数中分配变量。它仍然可以用来解决 Singleton
    模式试图解决的两个基本问题:全局访问和实例化控制。公共静态属性为访问实例提供了一个全局访问点。此外,由于构造函数是私有的,因此不能在类本身以外实例化
    Singleton 类;因此,变量引用的是可以在系统中存在的唯一的实例。


     

    由于 Singleton 实例被私有静态成员变量引用,因此在类首次被对 Instance
    属性的调用所引用之前,不会发生实例化。这种方法唯一的潜在缺点是,您对实例化机制的控制权较少。在 Design Patterns
    形式中,您能够在实例化之前使用非默认的构造函数或执行其他任务。由于在此解决方案中由 .NET Framework
    负责执行初始化,因此您没有这些选项。在大多数情况下,静态初始化是在 .NET 中实现 Singleton 的首选方法。


     

         (2.5)延迟初始化:


     

    clipboard


     

            (3)单例模式的优缺点:


     

    clipboard


     

            (4)单例模式适用情况和应用场景:


     

    clipboard

     

  • 相关阅读:
    node.js+mysql接口入门
    input边写边验证?正则表达式写在属性里?小技巧
    创建vue,react项目
    jquery在网页中加载本地json文件
    OpenFeigin服务接口调用
    Ribbon负载均衡服务调用
    Consul服务注册与发现
    Eureka服务注册与发现
    springboot项目在idea实现热部署
    设计模式——单例模式
  • 原文地址:https://www.cnblogs.com/itjeff/p/4081382.html
Copyright © 2011-2022 走看看