zoukankan      html  css  js  c++  java
  • 创建型模式:单例

    1.所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法就会失效。

    2.类的构造方法写成private的,那么外部就不能通过new去实例化它了。

    单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    懒汉式单例类:要在第一次被引用时,才会将自己实例化,所以被称为懒汉式单例类。

     1     /// <summary>
     2     /// 单例模式
     3     /// </summary>
     4     public class Singleton
     5     {
     6         private static Singleton instance;
     7 
     8         //私有的构造函数,防止外部使用new创建该类的实例
     9         private Singleton(){}
    10 
    11         //获得本类实例的唯一全局访问点
    12         public static Singleton GetInstance()
    13         {
    14             if (instance==null)
    15             {
    16                 instance = new Singleton();
    17             }
    18             return instance;
    19         }
    20     }

    多线程时的单例:

     1     /// <summary>
     2     /// 单例模式
     3     /// </summary>
     4     public class Singleton
     5     {
     6         private static Singleton instance;
     7 
     8         //程序运行时创建一个静态只读的进程辅助对象
     9         private static readonly object syncRoot = new object();
    10 
    11         //私有的构造函数,防止外部使用new创建该类的实例
    12         private Singleton(){}
    13 
    14         //获得本类实例的唯一全局访问点
    15         /*  lock:确保当一个线程位于代码的临界区时,另外一个线程不进入临界区。
    16             如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止)
    17             直到该对象被释放(MSDN)
    18          */
    19         public static Singleton GetInstance()
    20         {
    21             //第一种加锁方式:每次调用GetInstance都需要lock,会影响性能.
    22             //在同一时刻加了锁的那部分程序只有一个线程可以进入
    23             lock (syncRoot)
    24             {
    25                 if (instance == null)
    26                 {
    27                     instance = new Singleton();
    28                 }
    29             }
    30             //第二种加锁方式(双重锁定)先判断实例是否创建,未创建再加锁处理同时也能保证多线程的安全。
    31             if (instance==null)
    32             {
    33                 lock (syncRoot)
    34                 {
    35                     if (instance==null)
    36                     {
    37                         instance = new Singleton();
    38                     }
    39                 }
    40             }
    41             return instance;
    42         }
    43     }

    饿汉单例类:这种静态初始化的方式是自己在加载时就将自己实例化,所以形象的被称为饿汉式单例类

     1     /// <summary>
     2     /// 饿汉单例模式(静态初始化)
     3     /// sealed(密封类)阻止发生派生,而派生可能会增加实例
     4     /// </summary>
     5     public sealed class Singleton
     6     {
     7         //在第一次引用类的任何成员时创建实例,公共语言运行库负责处理变量初始化
     8         private static readonly Singleton instance = new Singleton();
     9 
    10         private Singleton() { }
    11 
    12         public static Singleton GetInstance()
    13         {
    14             return instance;
    15         }
    16     }

    饿汉式单例类和懒汉式单例类的区别:

    饿汉式(即静态初始化的方式):它是类一加载就实例化对象,所以要提前占用系统资源。

    懒汉式:会面临多线程访问的安全性问题,需要做双重锁定处理才可以保证线程安全。

  • 相关阅读:
    学习GlusterFS(二)
    并不对劲的莫比乌斯反演
    并不对劲的WC2019
    并不对劲的loj2134:uoj132:p2304:[NOI2015]小园丁与老司机
    并不对劲的bzoj3626:loj2558:p4211:[LNOI2014]LCA
    并不对劲的bzoj3214:p3333:[ZJOI2013]丽洁体
    并不对劲的bzoj4827:loj2020:p3723:[AHOI/HNOI2017]礼物
    并不对劲的bzoj4560:p3269:[JLOI2016]字符串覆盖
    并不对劲的p2664树上游戏
    并不对劲的p3709:大爷的字符串题
  • 原文地址:https://www.cnblogs.com/wgx0428/p/4022838.html
Copyright © 2011-2022 走看看