• 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;
                }
            }
        }

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

  • 相关阅读:
    初识多线程
    java开发中我们经常用到的一些名词
    gitHub提交代码
    Java-基础-HashMap
    Java-基础-LinkedList
    Java-基础-ArrayList
    Java-基础-JDK动态代理
    Java-基础-反射
    RabbitMQ-延迟队列
    RabbitMQ-TTL-死信队列_DLX
  • 原文地址:https://www.cnblogs.com/chuangege/p/5895357.html
Copyright © 2020-2023  润新知