zoukankan      html  css  js  c++  java
  • 设计模式-单例

    1. 单例模式(单线程和多线程)
    2. 单例模式的三种写法
    3. 单例模式的优缺点和应用场景

    单例保证了整个进程中该对象只被实例化一次
    常驻内存

    普通类型是需要的时候被初始化,用完被GC回收

    namespace singletonpattern
    {
        /// <summary>
        /// 1. 私有化构造函数,外部不能用new创建对象
        /// 2. 一个私有的静态变量
        /// 3. 一个静态的对象创建方法
        /// </summary>
        class Singleton
        {
            private Singleton () 
            {
                Thread.Sleep(1000);//耗时
                string bigSize = "占用10M内存";//耗计算资源
                string resource = "占用多个线程和数据库连接资源";//耗有限资源
                Console.WriteLine("{0}被构造,线程id={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
            }
            private static Singleton _Singleton = null;
    
            //单进程时候的单例
            //public static Singleton CreateInstance()
            //{
            //    if (_Singleton == null)
            //    {
            //        _Singleton = new Singleton();
            //    }
            //    return _Singleton;
            //}
    
            //多进程下的单例,双重if+lock
            private static object Singleto_Lock = new object();
            public static Singleton CreateInstance()
            {
                if (_Singleton == null)//保证对象初始化之后的所有线程,不需要等待锁
                {
                    Console.WriteLine("准备进入lock");
                    lock (Singleto_Lock) //保证只有一个线程进去判断
                    {
                        Thread.Sleep(1000);
                        if (_Singleton == null) //保证对象为空才真的创建
                        {
                            _Singleton = new Singleton();
                        }
                    }
                }
                return _Singleton;
            }
            public void Show()
            {
                Console.WriteLine("这里调用了{0}.Show", this.GetType().Name);
            }
        }
    }
    namespace singletonpattern
    {
    
        class SingletonSecond
        {
            private SingletonSecond() 
            {
                Thread.Sleep(1000);//耗时
                string bigSize = "占用10M内存";//耗计算资源
                string resource = "占用多个线程和数据库连接资源";//耗有限资源
                Console.WriteLine("{0}被构造,线程id={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
            }
            private static SingletonSecond _Singleton = null;
    
            /// <summary>
            /// 静态构造函数:由CLR保证,在第一次使用这个类之前,调用并且只调用一次
            /// </summary>
            static SingletonSecond ()
            {
                _Singleton = new SingletonSecond();
            }
            public static SingletonSecond CreateInstance()
            {
                return _Singleton;
            }
            public void Show()
            {
                Console.WriteLine("这里调用了{0}.Show", this.GetType().Name);
            }
        }
    }
    namespace singletonpattern
    {
    
        class SingletonThird
        {
            private SingletonThird() 
            {
                Thread.Sleep(1000);//耗时
                string bigSize = "占用10M内存";//耗计算资源
                string resource = "占用多个线程和数据库连接资源";//耗有限资源
                Console.WriteLine("{0}被构造,线程id={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
            }
            /// <summary>
            /// 静态变量:会在类型第一次使用的时候初始化,并且只初始化一次
            /// </summary>
    
            private static SingletonThird _Singleton = new SingletonThird();
    
            public static SingletonThird CreateInstance()
            {
                return _Singleton;
            }
            public void Show()
            {
                Console.WriteLine("这里调用了{0}.Show", this.GetType().Name);
            }
        }
    }
  • 相关阅读:
    转 : jmeter分布式测试的坑
    Node.js 事件循环
    ubuntu 16.04 安装nodejs
    java中native的用法
    分布式与集群的概念区别
    IntegerToBinaryString
    Mysql InnoDB事务
    浅析Mysql InnoDB存储引擎事务原理
    Mysql数据库事务的隔离级别和锁的实现原理分析
    MySQL中MyISAM和InnoDB的区别
  • 原文地址:https://www.cnblogs.com/xiao9426926/p/6126224.html
Copyright © 2011-2022 走看看