zoukankan      html  css  js  c++  java
  • C#单例模式

    前言:单例模式是我们在软件开发中比较常用的模式之一,能很好的理解并运用对软件的性能是有很大的帮助的。

    一、饿汉式

    public class Singleton
    
    {
    
              private static Singleton _instance = new Singleton();
    
              private Singleton() { }
    
              public static Singleton GetInstance() { return _instance; }
    
    }
    View Code

    点评:该种实现,在程序一运行就将对象加载到内存,由于静态变量是常驻于内存不会被GC回收,故该实例化方式适用于经常使用的对象。对象一开始就被实例化了所以在多线程环境下是线程安全的。

    二、懒汉式

        //懒汉式(不安全)
        public class LazySingleton
        {
            private static LazySingleton instance = null;
            private LazySingleton()
            { }
            public static LazySingleton GetInstance()
            {
                if (instance == null)
                    instance = new LazySingleton();
                return instance;
            }
        }
    View Code

    点评:在初次调用实例方法时才会创建实例,解决了饿汉式的缺点,但在多线程环境下是不安全的

    三、懒汉式-线程安全

        //懒汉式(线程安全)
        public class LazySaleSingleton
        {
            private static object lockObj = new object();
            private static LazySaleSingleton instance = null;
            private LazySaleSingleton()
            { }
            public static LazySaleSingleton GetInstance()
            {
                lock (lockObj)
                {
                    if (instance == null)
                        instance = new LazySaleSingleton();
                }
                return instance;
            }
        }
    View Code

    点评:解决了普通懒汉式的线程安全问题,但由于用到了锁,不管实例是否已存在都要执行锁区域的代码,带来了额外开销在高并发环境下不是最优方案

    四、双验锁

        public class Singleton
        {
            private static object obj = new object();
            private static Singleton _singletion;
            private Singleton()
            { }
    
            public static Singleton Instance
            {
                get
                {
                    if (_singletion == null)
                    {
                        lock (obj)
                        {
                            if (_singletion == null)
                            {
                                _singletion = new Singleton();
                            }
                        }
                    }
                    return _singletion;
                }
            }
        }
    View Code

    点评:双验锁,相对于单检查锁,减少了不必要的入锁开销,可根据项目实际情况做出选择

    五、静态内部类方式

        //静态内部类
        public class InterSingleton
        {
            private InterSingleton()
            { }
            public static class InterSingletonHelp
            {
                private static InterSingleton instance = new InterSingleton();
                public static InterSingleton GetInstance()
                {
                    return instance;
                }
            }
        }
    View Code

    点评:无锁化,只有在真正使用单例对象时才会产生实例,线程安全

    六、.net4.0  Lazy 模式

        //.net4.0 Lazy模式
        public class Singleton
        {
            private static Lazy<Singleton> instance = new Lazy<Singleton>();
            private Singleton()
            { }
            public static Lazy<Singleton> GetInstance()
            {
                return instance;
            }
        }
    View Code

    点评:对象延迟加载,当成员被访问时才初始化成员对象,提高了资源利用效率

    本人专注于.net平台开发,擅长开发企业管理系统,CRM系统,ERP系统,财务系统,权限系统,非常乐意跟大家讨论相关系统的设计和开发技巧
  • 相关阅读:
    rocketmq的broker如何同步信息的?
    SO_LINGER 选项
    哈哈哈
    NAG博客目录
    事后分析$eta$
    项目展示$eta$
    测试报告$eta$
    发布声明$eta$
    Scrum meeting 10
    技术博客6--Django实现列表分页
  • 原文地址:https://www.cnblogs.com/heweijian/p/5511688.html
Copyright © 2011-2022 走看看