zoukankan      html  css  js  c++  java
  • 单例模式Singleton 代码

    懒汉式单例:在第一次被引用时才会将自己实例化。

        class Singleton
        {
            private static Singleton instance;
            //程序运行时创建一个静态只读的进程辅助对象
            private static readonly object syncRoot = new object();
            //构造方法让其private,外界就无法使用new创建实例
            private Singleton()
            {
            }

            //获得本类实例的唯一全局访问点
            public static Singleton GetInstance()
            {
                /*
                 * 先判断实例是否存在,不存在再加锁处理。这样不用让线程每次都加锁,而只是在实例未被创建的时候再加锁处理。同时也能保证多线程安全。
                 * 这种做法被称Double-Check Locking(双重锁定)。
                 * 两次判断instance==null是因为当同时有两个线程调用GetInstance()方法时,它们将可以通过第一重instance==null的判断,然后由于lock机制,
                 * 这两个线程则只有一个进入,另一个在外排队等候,必须要其中的一个进入并出来后,另一个才能进入。而此时如果没有了第二重的instance是否为
                 * null的判断,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的。
                 
    */
                if (instance == null)
                {
                    //在同一个时刻,只有一个线程可以进入
                    lock (syncRoot)
                    {
                        //若实例不存在,则new一个新的实例,否则返回已有的实例
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }

    饿汉式代例:自己被加载时就将自己实例化。

        /// <summary>
        
    /// 静态初始化方法
        
    /// C#与公共语言运行库也提供了一种‘静态初始化’方法,这种方法不需要开发人员显式地编写线程安全代码,即可解决多线程环境下它是不安全的问题。
        
    /// </summary>
        sealed class Singletom2
        {
            //sealed 阴止发派生,而派生可能会增加实例
            
    //在第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化
            private static readonly Singletom2 instance = new Singletom2();
            private Singletom2() { }
            public static Singletom2 GetInstance()
            {
                return instance;
            }
        }

    静态初始化方式提前占用系统资源,懒汉方式面临多线程访问安全性问题。从C#语言角度来讲,饿汉式的单例类已经足够满足我们的需求了。

  • 相关阅读:
    正则表达式(四)--文本换行分割
    java加密类型和算法名称
    记事本记录日志
    DNS
    jstl--c:choose标签
    csv文本编辑引号问题
    JDBC----ReflectionUtils
    Jsp
    计算机网络 编程 总结:
    N颗骰子的问题
  • 原文地址:https://www.cnblogs.com/scottckt/p/2358725.html
Copyright © 2011-2022 走看看