zoukankan      html  css  js  c++  java
  • c# 单例模式

    1.Double-Checked Locking
    public static Singleton3 Instance
    {
    get
    {
    // Double-Check 双重判断避免不必要的加锁
    if (instance == null)
    {
    // 确定实例为空时再等待加锁
    lock (syncObject)
    {
    // 确定加锁后实例仍然未创建
    if (instance == null)
    {
    instance = new Singleton3();
    }
    }
    }

            return instance;
        }
    }
    

    加锁机制来确保在多线程环境下只创建一个实例,并且用两个if判断来提高效率。
    2.利用静态构造函数
    public sealed class Singleton4
    {
    private Singleton4() { }
    // 在大多数情况下,静态初始化是在.NET中实现Singleton的首选方法。
    static Singleton4() { }

        private static readonly Singleton4 instance = new Singleton4();
    
        public static Singleton4 Instance
        {
            get
            {
                return instance;
            }
        }
    }
    

    在使用静态构造函数的时候应该注意几点:

      1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
      
      2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。

      3、一个类只能有一个静态构造函数。

      4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。

      5、最多只运行一次。

      6、静态构造函数不可以被继承。

      7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
    3. 内部类(懒汉模式)
    public sealed class Singleton5
    {
    private Singleton5() { }

        public static Singleton5 Instance
        {
            get
            {
                return Nested.instance;
            }
        }
    
        // 使用内部类+静态构造函数实现延迟初始化
        class Nested
        {
            static Nested() { }
    
            internal static readonly Singleton5 instance = new Singleton5();
        }
    }
    

    参考:
    https://www.cnblogs.com/leolion/p/10241822.html
    https://www.cnblogs.com/edisonchou/p/4735373.html
    https://www.cnblogs.com/87700180/p/11865597.html
    https://www.cnblogs.com/michaelxu/archive/2007/03/29/693401.html

  • 相关阅读:
    Swift8-枚举Enumerations
    Swift7-闭包
    Swift6-函数
    Swift5-控制流
    Swift4-集合类型
    什么是node.js
    nodejs的安装
    环境变量的认识,,,
    shell是什么,各种shell的初步认识,适用于初学者
    exports和module.exports的区别
  • 原文地址:https://www.cnblogs.com/wangzhe66369/p/12786165.html
Copyright © 2011-2022 走看看