zoukankan      html  css  js  c++  java
  • 设计模式:单例模式(Singleton)

    定义确保一个类仅有一个实例,并提供一个访问它的全局访问点

    优点:在内存中只有一个对象,节省了内存空间

    示例

    Singleton.cs    

    写法一:非线程安全

     public class Singleton
        {
            //声明一个静态的类变量
            private static Singleton singleton;
    
            /// <summary>
            /// 私有构造函数,避免外部代码new实例化对象
            /// </summary>
            private Singleton()
            {
    
            }
    
            /// <summary>
            /// 实例化对象
            /// </summary>
            /// <returns></returns>
            public static Singleton GetInstance()
            {
                if (singleton == null)
                {
                    singleton = new Singleton();
                }
    
                return singleton;
            }
        }
    View Code

    写法二:简单线程安全
        多线程程序中,多个线程同时访问Singleton类,调用GetInstance()方法,可能会创建多个对象,这种情况我们该如何处理呢?

        遇到这种情况我们可以给进程上一把锁(lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放[MSDN])。

     public class Singleton
        {
            //声明一个静态的类变量
            private static Singleton singleton;
            //程序运行时创建一个静态只读进程辅助对象
            private static readonly object syncRoot = new object();
    
            /// <summary>
            /// 私有构造函数,避免外部代码new实例化对象
            /// </summary>
            private Singleton()
            {
    
            }
    
            /// <summary>
            /// 实例化对象
            /// </summary>
            /// <returns></returns>
            public static Singleton GetInstance()
            {
                lock (syncRoot)
                {
                    if (singleton == null)
                    {
                        singleton = new Singleton();
                    }
                }          
    
                return singleton;
            }
        }
    View Code   

    写法三:双重锁定线程安全  

     public class Singleton
        {
            //声明一个静态的类变量
            private static Singleton singleton;
            //程序运行时创建一个静态只读进程辅助对象
            private static readonly object syncRoot = new object();
    
            /// <summary>
            /// 私有构造函数,避免外部代码new实例化对象
            /// </summary>
            private Singleton()
            {
    
            }
    
            /// <summary>
            /// 实例化对象
            /// </summary>
            /// <returns></returns>
            public static Singleton GetInstance()
            {
                //先判断实例是否存在,不存在再加锁处理
                if (singleton==null)
                {
                    lock (syncRoot)
                    {
                        if (singleton == null)
                        {
                            singleton = new Singleton();
                        }
                    } 
                }
                         
    
                return singleton;
            }
        }
    View Code

     客户端调用:

     protected void Page_Load(object sender, EventArgs e)
            {
                Singleton singleton1 = Singleton.GetInstance();
                Singleton singleton2 = Singleton.GetInstance();
    
                if (singleton1 == singleton2)
                {
                    Response.Write("两个对象是同一个示例");
                }
            }


    测试结果

    输出:两个对象是同一个示例

                  

  • 相关阅读:
    nagios监控oracle 表空间
    Oracle报错,ORA-28001: 口令已经失效
    存储基本知识【转载】
    通过shell查找访问日志中访问量最大的ip
    《Java程序设计》 第二周学习任务
    IntelliJ IDEA 激活
    破解某绝地和某DNF辅助
    SMMS:一个不错的免费图床
    Linux使用ASF云挂卡(挂游戏时长)
    Centos7手动编译安装apache
  • 原文地址:https://www.cnblogs.com/qianxingdewoniu/p/3517717.html
Copyright © 2011-2022 走看看