常见的单例模式实现

目录

什么是单例模式

懒汉式(静态变量,推荐)

 懒汉式(线程不安全,不推荐)

单锁模式(线程安全,不推荐)

双层验证(推荐)

 静态内部类(线程安全,推荐)

Lazy泛型


什么是单例模式

单例模式是一种常见的软件设计模式。通过单例模式实现在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个获得其对象实例的方法(静态方法)。

懒汉式(静态变量,推荐)

namespace ConsoleApp3
{

    namespace ConsoleApp3
    {
        class Singleton
        {
            /// <summary>
            /// 显式的静态构造函数用来告诉C#编译器在其内容实例化之前不要标记其类型
            /// </summary>
            static Singleton() { }

            // 1.构造器私有化
            private Singleton() { }

            // 2.本类的内部创建对象实例
            private static readonly Singleton instance = new Singleton();

            // 3.暴露一个公有的静态方法,返回实例对象
            public static Singleton getInstance()
            {
                return instance;
            }
        }

    }



}

优点:写法简单,在类装载的时完成实例化,避免了线程同步问题

缺点:类装载时完成实例化,没有达到LazyLoading的效果,若该实例从未使用,则会造成内存浪费

 懒汉式(线程不安全,不推荐)

namespace ConsoleApp3
{
    class Singleton
    {

        // 1.构造器私有化
        private Singleton() { }

        // 2.静态属性,存放本类对象
        private static Singleton instance;

        // 3.静态的公有方法,当使用到该方法时才会去创建instance
        public static Singleton getInstance()
        {
            // 当静态属性没有被赋值的时候再去创建
            if (instance == null)
            {
                instance = new Singleton();
            }
            // 如果这个静态属性被初始化过了,就直接返回,保证是单例的
            return instance;
        }
    }


}

优点:起到了懒加载效果,但是只能在单线程使用。

缺点:多线程会不安全,因为当多个线程并发同时判断instance为空时,就会相应的实例化多个对象。

单锁模式(线程安全,不推荐)

namespace ConsoleApp3
{
    public sealed class Singleton
    {
        private static Singleton instance = null;
        private static readonly object _lock = new object();

        private Singleton() { }
        public static Singleton Instance
        {
            get
            {
                lock (_lock)
                {
                    if (instance == null)
                        instance = new Singleton();
                    return instance;
                }
            }
        }
    }


}

优点:线程安全

缺点:每次都需要判断锁,性能低

双层验证(推荐)

namespace ConsoleApp3
{
    public sealed class Singleton
    {
        private volatile  static Singleton instance = null;
        private static readonly object _lock = new object();

        private Singleton() { }
        public static Singleton Instance
        {
            get
            {
                if(instance == null)
                {
                    lock (_lock)
                    {
                        if (instance == null)
                            instance = new Singleton();
                    }
                }
                return instance;

            }
        }
    }


}

优点:线程安全且通过双null判断,减少进锁的逻辑,提高性能。

 静态内部类(线程安全,推荐)

namespace ConsoleApp3
{
    namespace ConsoleApp3
    {
        class Singleton
        {
            private static volatile Singleton instance;
            private Singleton() { }
            //静态内部类,包含一个静态属性:Singleton
            private static class SingletonInstance
            {
                internal static readonly Singleton INSTANCE = new Singleton();
            }

            //对外公有的静态方法,直接返回SingletonInstance.INSTANCE
            public static  Singleton getInstance()
            {
                return SingletonInstance.INSTANCE;
            }
        }
    }
}

优点:简单、线程安全。

Lazy泛型
public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());
 
    public static Singleton Instance { get { return lazy.Value; } }
 
    private Singleton()
    {
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值