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

    版本1:最简单的单例模式

    public class MySingleton
        {
            private MySingleton()  //构造函数,注意private
            {
            }
            private static MySingleton _Entity = null;  //私有字段
    
            public static MySingleton Entity  //公共属性
            {
                get
                {
                    if (_Entity == null)  //确保只能创建一次对象
                    {
                        MySingleton._Entity = new MySingleton();
                    }
                    return MySingleton._Entity;
                }
            }
        }

    方法二:

    public class MySingleton
        {
            private MySingleton()  //构造函数,注意private
            {
            }
            private static MySingleton _Entity = null;  //私有字段
    
            public static MySingleton GetEntity()  //公有方法
            {
                if (_Entity == null)  //确保只能创建一次对象
                {
                    MySingleton._Entity = new MySingleton();
                }
                return MySingleton._Entity;
            }
        }

    两点:1)保证所有构造函数不被外部所调用;2)利用属性或者方法调用对象。

    缺点:无法保证线程的安全性,多个线程的情况下可能创建多个对象。

    版本2:线程安全的单例模式 

    public class MySingleton
        {
            private MySingleton()  //构造函数,注意private
            {
            }
    
            private static readonly object obj = new object();
            private static MySingleton _Entity = null;  //私有字段
    
            public static MySingleton Entity  //公共属性
            {
                get
                {
                    lock (obj)  //确保同一时刻,加锁的代码段只能被一个线程执行
                    {
                        if (_Entity == null)  //确保只能创建一次对象
                        {
                            MySingleton._Entity = new MySingleton();
                        }
                    }
                    return MySingleton._Entity;
                }
            }
        }

    缺点:无论对象是否已经被创建,都要进行加锁,增加了不必要的开销。

    版本3:Double-Checked Locking  

    public class MySingleton
        {
            private MySingleton()  //构造函数,注意private
            {
            }
    
            private static readonly object obj = new object();
            private static MySingleton _Entity = null;  //私有字段
    
            public static MySingleton Entity  //公共属性
            {
                get
                {
                    if (_Entity == null)  //第一次检验,用于减少不必要的加锁
                    {
                        lock (obj)  //确保同一时刻,加锁的代码段只能被一个线程执行
                        {
                            if (_Entity == null)  //第二次检验,确保只能创建一次对象
                            {
                                MySingleton._Entity = new MySingleton();
                            }
                        }
                    }
                    return MySingleton._Entity;
                }
            }
        }

    这种方法既保证了线程的安全,又减少了加锁带来的不必要的开销

  • 相关阅读:
    高德全链路压测平台TestPG的架构与实践
    性能测试之稳定性测试(可靠性测试)
    服务端高并发分布式架构演进之路
    高性能高并发系统的稳定性保障
    聊聊服务稳定性保障这些事
    qt 待研究
    k73 uboot 和emmc启动移植
    Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
    C++ Lambda 编译器实现原理
    qt 网络编程参考资料
  • 原文地址:https://www.cnblogs.com/chuangege/p/5895357.html
Copyright © 2011-2022 走看看