• 设计模式:单件模式


    Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。

    1. 单线程时方法

    public sealed class Singlton
    {
        static Singlton instance = null;
        Singlton()
        { }
    
        public static Singlton Instance
        {
            get
            {
                if (instance == null)
                {
                    return new Singlton();
                }
                return instance;
            }    
        }    
    }

    这句if (instance == null)不是线程安全的,可能产生多个实例。

    2.线程安全的

    public sealed class Singlton
    {
        static Singlton instance = null;
    
        static readonly object o = new object();
    
        Singlton()
        { }
    
        public static Singlton Instance
        {
            get
            {
                lock (o)
                {
                    if (instance == null)
                    {
                        return new Singlton();
                    }
                    return instance;
                }
            }    
        }    
    }

    对象实例由最先进入的那个线程创建,后来的线程在进入时(instence == null)为假,不会再去创建对象实例了。但是这种实现方式增加了额外的开销,损失了性能。

    3. 双重锁定

    public sealed class Singlton
    {
        static Singlton instance = null;
    
        static readonly object o = new object();
    
        Singlton()
        { }
    
        public static Singlton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (o)
                    {
                        if (instance == null)
                        {
                            return new Singlton();
                        }
                    }
                }
                return instance;
            }
        }
    }

    避免了每个 Instance 属性方法的调用中都出现独占锁定。

    4. 静态初始化

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

    5. 延迟静态初始化

    public sealed class Singlton
    {       
    
        static Singlton()
        { }
        
        public static Singlton Instance
        {
            get
            {
                return CreateSinglton.instance;
            }
        }
        
        class CreateSinglton
        {
            internal static readonly Singlton instance = new Singlton();
        
            static CreateSinglton() { }
        }
    }
  • 相关阅读:
    InnoDB的锁机制浅析(二)—探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/插入意向锁)
    InnoDB的锁机制浅析(一)—基本概念/兼容矩阵
    InnoDB的锁机制浅析(All in One)
    JMS Java消息服务(Java Message Service)
    命名和目录接口 JNDI-The Java Naming and Directory Interface
    Jenkins系列教程之
    Jenkins系列教程之
    Jenkins系列教程之
    【小笔记】大数据量excel解析工具性能对比
    【小笔记】Activiti扩展数据库支持类型
  • 原文地址:https://www.cnblogs.com/cnblogsfans/p/1611183.html
Copyright © 2020-2023  润新知