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系统,财务系统,权限系统,非常乐意跟大家讨论相关系统的设计和开发技巧
  • 相关阅读:
    为什么我的Android SDK Manager中只显示已安装的package?
    解决Android Studio Gradle Build特别慢的问题
    一款不错的取色器
    Android Studio没有导包快捷键怎么办
    Android Studio中有没有类似于Eclipse中的ctrl+2+L的快捷键? Android Studio快捷键之代码提示
    安卓动画总结【非原创】
    ButterKnife-5.1.2.jar(较低版本的ButterKnife)使用方法
    【转】调用getActionBar()报Call requires API level 11 (current min is 8): android.app.Activity#getActionBar
    spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)转
    详解 Spring 3.0 基于 Annotation 的依赖注入实现(转)
  • 原文地址:https://www.cnblogs.com/heweijian/p/5511688.html
Copyright © 2011-2022 走看看