zoukankan      html  css  js  c++  java
  • C#中实例Singleton

    C#中实例Singleton

    1、经典方案:

    using System; 
    public class Singleton 
    { 
       private static Singleton instance; 
       private Singleton() {} 
       public static Singleton Instance 
       { 
          get  
          { 
             if (instance == null) 
             { 
                instance = new Singleton(); 
             } 
             return instance; 
          } 
       } 
    } 

    该实现主要有两个优点:

    • 由于实例是在 Instance 属性方法内部创建的,因此类可以使用附加功能(例如,对子类进行实例化),即使它可能引入不想要的依赖性。

    • 直到对象要求产生一个实例才执行实例化;这种方法称为"懒实例化"。懒实例化避免了在应用程序启动时实例化不必要的 singleton

    但是,这种实现的主要缺点是在多线程环境下它是不安全的。如果执行过程的不同线程同时进入 Instance 属性方法,那么可能会创建多个 Singleton 对象实例。每个线程都会执行下列语句,并决定必须创建新的实例:

    if (instance == null) 

    2、Double-Check Locking

    using System; 
    public sealed class Singleton 
    { 
       private static volatile Singleton instance; 
       private static object syncRoot = new Object(); 
       private Singleton() {} 
       public static Singleton Instance 
       { 
          get  
          { 
             if (instance == null)  
             { 
                lock (syncRoot)  
                { 
                   if (instance == null)  
                      instance = new Singleton(); 
                } 
             } 
             return instance; 
          } 
       } 
    } 

      此方法确保了仅在需要实例时才会创建仅一个实例。此外,变量被声明为 volatile,以确保只有在实例变量分配完成后才能访问实例变量。最后,此方法使用 syncRoot 实例来进行锁定(而不是锁定类型本身),以避免发生死锁。

    3、静态初始化

    public sealed class Singleton 
    { 
       private static readonly Singleton instance = new Singleton(); 
       private Singleton(){} 
       public static Singleton Instance 
       { 
          get  
          { 
             return instance;  
          } 
       } 
    } 

      该实现与前面的示例类似,不同之处在于它依赖公共语言运行库来初始化变量。它仍然可以用来解决 Singleton 模式试图解决的两个基本问题:全局访问和实例化控制。公共静态属性为访问实例提供了一个全局访问点。此外,由于构造函数是私有的,因此不能在类本身以外实例化 Singleton 类;因此,变量引用的是可以在系统中存在的唯一的实例。

      由于 Singleton 实例被私有静态成员变量引用,因此在类首次被对 Instance 属性的调用所引用之前,不会发生实例化。因此,与 Design Patterns 形式的 Singleton 一样,该解决方案实现了懒实例化属性的一种形式。

      这种方法唯一的潜在缺点是,您对实例化机制的控制权较少。在 Design Patterns 形式中,您能够在实例化之前使用非默认的构造函数或执行其他任务。由于在此解决方案中由 .NET Framework 负责执行初始化,因此您没有这些选项。在大多数情况下,静态初始化是在 .NET 中实现 Singleton 的首选方法。此示例中通过运行库来保证线程安全。

    在 C# 中实现 Singleton 具有下列优缺点:

    优点

    • 由于 .NET Framework 显式地指定静态变量初始化如何以及何时发生,因此静态初始化方法是可能的。

    • 列的前面的"多线程 Singleton"中所描述的 Double-Check Locking 技术已在公共语言运行库中正确实现。

    参考:http://msdn.microsoft.com/zh-cn/library/ff650316.aspx

  • 相关阅读:
    【转】js竖状伸缩导航
    大学易站暂时关闭通知
    【转】神同步!这俩熊孩子太会玩了,以前的同步都弱爆了
    【技术贴】搜狗浏览器 标签页 看后吧 解决
    四级查分步骤解决无法找到对应的分数 请确认你已安装并启动了CET查分保护盾
    解决Mysql远程连接出错不允许访问 ERROR 1130:Host is not allow
    xml 获取节点下的 属性。
    Oracle 获取日期区间数据
    js 数值转换为3位逗号分隔
    xml获取子节点
  • 原文地址:https://www.cnblogs.com/tekkaman/p/3847454.html
Copyright © 2011-2022 走看看