首页 > 其他分享 >单例模式的介绍

单例模式的介绍

时间:2022-08-28 13:11:48浏览次数:65  
标签:Singleton 介绍 uniqueInstance 实例 线程 模式 单例

  单例模式是设计模式中常用的设计模式之一,它提供一种创建对象的方式。

 这种模式仅涉及一个单一的类,该类负责创建自身的对象(下面称对象为实例),同时确保只有一个对象被创建。
 单例模式的应用:windows操作系统的任务管理器只有一个,用户无法打开两个任务管理器窗体;
              web网站访问量计数器,需要使用单例模式,保证计数准确;
	      多线程文件读写问题,一个文件不能被多个线程同时读写,
	      使用单例模式防止文件读写冲突,每一个线程读写文件必须通过唯一的实例进行操作。
 
 单例模式实现思路:在内存中只有一个实例,应用单例模式的类的构造函数是私有的(对象不可以随便New了),
                类的对象通过类内的公有方法创建,所以实现单例模式先判断内存中是否已存在类的实例,
	        有则直接返回该实例

 单例模式有多种写法,下面只给出两种方式:双重校验锁和静态内部类

双重校验锁:

    /// <summary>
    /// 单例模式的实现
    /// </summary>
    public class Singleton
    {
        // 定义一个静态变量来保存类的实例
        private static Singleton uniqueInstance;
        // 定义一个标识作为线程间同步的标志
        private static readonly object locker = new object();
        // 定义私有构造函数,使外界不能创建该类实例
        private Singleton()
        {
        }

        // 定义公有方法,提供一个全局访问点,供外部访问
        public static Singleton GetInstance()
        {
            // lock方法会消耗计算机性能,使用lock方法前先判断uniqueInstance == null,可以降低性能消耗
            //当第一个线程运行到这里时,此时会对locker对象 "加锁",
            // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
            // lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
            // 双重锁定只需要一句判断就可以了
            if (uniqueInstance == null)
            {
                lock (locker)
                {
                    // 如果类的实例不存在则创建,否则直接返回已创建的对象
                    if (uniqueInstance == null)
                    {
                        uniqueInstance = new Singleton();
                    }
                }
            }
            return uniqueInstance;
        }
    }

 

静态内部类

public class Singleton
{
     //静态内部类
     private static class StaticSingleton
     {
      //创建单例模式的实例
      public static Singleton SingletonInside = new Singleton();
      }
     // 定义私有构造函数
     private Singleton(){ }
     public static Singleton GetSingleton()
     {
      return StaticSingleton.SingletonInside;
     }
}

 

 

 https://www.cnblogs.com/c-djt/p/6416273.html

标签:Singleton,介绍,uniqueInstance,实例,线程,模式,单例
From: https://www.cnblogs.com/ZkbFighting/p/16632608.html

相关文章

  • ansible 001 ansible介绍 原理
    ansible自动化运维ansible部署应用程序(在操作系统层面之上)系统初始化过程主机名,yun源,网络,服务,时间同步,内核参数(可以在pxe这里完成)ansible可以方便100多台......
  • 操作系统的介绍
    操作系统的介绍1.什么是操作系统操作系统其实就是一个协调、管理、控制计算机硬件资源和软件资源的一个控制程序2.为什么要有操作系统(1)可以控制计算机硬件的基本运行(2......
  • 设计模式-建造者模式
    //1.定义产品//2.抽象构造者,定义抽象方法//3.具体建造者,生产具体的建造方法//4.指挥者,负责生产具体的产品packagecom.serlyf.builder;//产品publicclassHouse......
  • 基本数据类型与严格模式和约束条件(3)
      整型 分类TINYINTSMALLINTMEDUIMINTINTBIGINT"""以TINYINT是否有符号默认情况下是带符号的超出会如何超出限制只存最大可接......
  • 平台与软件跨平台介绍
    1.平台一个平台是由计算机硬件+操作系统组成的2.软件跨平台软件跨平台指的是:一款软件可以在任意平台上运行。比如,python就是一款跨平台很强的软件,它支持在windows、lin......
  • 第五章-DI反模式
    许多菜肴都需要用油在锅中烹饪食物。如果您不熟悉手头的食谱,则可以开始加热油,然后转身阅读食谱。但是一旦切完蔬菜,油就会冒出来。您可能会认为吸烟油意味着平底锅很热,可以......
  • arm coresight介绍及trace32配置
    armcoresight是什么ArmCoreSight技术提供了额外的调试和跟踪功能,目的是调试整个片上系统(SoC)。CoreSight是一个硬件组件的集合,可以由芯片设计者根据自己的片上系统选择......
  • Linux centos7 如何配置静态ip(Nat模式)
    今天来讲下如何在vmware虚拟机Nat网络下配置静态ip地址。......
  • 版本控制工具Git介绍-01
    使用版本控制工具是为了方便团队开发,比如多人共同维护一个项目的时候,用版本控制工具可以很方便的维护项目代码,如果哪天你改了一个版本,出问题了,我们也可以很快的找到你改了......
  • Redis 集群模式
    概述Redis在3.0之后开始支持Cluster(集群)模式,特点如下:支持节点的自动发现:可向集群动态添加节点,并自动融入支持slave-master选举和容错:多个master宕机后,选举出......