• 欢迎访问我爱CSharp学习网,这里有最新最全的C#书籍,C#视频。
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏我爱C#学习网吧
  • 推荐使用最新版Chrome浏览器和火狐浏览器访问本网站

C#开发模式——单例模式

C#杂烩 52csharp 1501次浏览 0个评论 扫描二维码

C#开发模式——单例模式


一、单例模式简介

单例模式是为保证一个对象,在程序运行的任何时刻只有一个实例存在,我们把这种实现方式称之为“单例模式”。

二、单例模式的核心

单例类只有一个实例存在
单例类提供一个全局访问点
单例类通过自己创建唯一实例
单例类对外所有访问对象都提供一个唯一实例。

三、单例模式的优点

1、在程序运行中只有一个实例,减少内存占用,减少频繁的创建和销毁实例所带来的系统开销,
2、避免资源的多种无效占用
单例模式缺点:
没有接口 不能继承

四、单例模式应用场景

当一个事物在特定的环境中,只会存在一个实例时,我们可以采用单例模式对其进行设计。
例: 数据库连接池,计算机注册表 一个国家只有一个总统 日志系统中的日志文件 计算机中的打印池 计算机设备管理器
生成唯一序列号 网站计数器

五、单例模式的实现方式

1、非线程安全(尽量不要用)

public sealed class Singleton

{

    private static Singleton instance=null;

 

    private Singleton()

    {

    }

 

    public static Singleton Instance

    {

        get

        {

            if (instance==null)

            {

                instance = new Singleton();

            }

            return instance;

        }

    }

}

说明:上面的方法是非线程安全的,2个不同的线程可以同时进入这个方法,如果instance为空的并且这里返回真的情况下,都可以创建实例,这显然违反了单例模式,实际上,在测试以前,实例就已经有可能被创建了,

但是内存模型不能保证这个实例能被其他的线程看到,除非合适的内存屏障已经被跨过了。

2、简单的线程安全

public sealed class Singleton

{

    private static Singleton instance = null;

    private static readonly object padlock = new object();


    Singleton()

    {

    }


    public static Singleton Instance

    {

        get

        {

            lock (padlock)

            {

                if (instance == null)

                {

                    instance = new Singleton();

                }

                return instance;

            }

        }

    }

}

上述实现是线程安全的。这个线程在共享的object上取出了一把锁,然后在创建实例以前检查这个实例是否被创建了。

这个保护了内存屏障问题(lock保证了所有的读取操作是在LOCK获得以后发生的,所有的unlock保证了所有的写操作在lock 释放以后发生的),这样就保证了一个线程只能创建一个实例(每次只有一个线程在这段代码中运行),不巧的是,性能上来说,锁变成了每次都必须的当这个实例被响应的时候。

3、尝试线程安全(双重锁定)不推荐使用

public sealed class Singleton

{

    private static Singleton instance = null;

    private static readonly object padlock = new object();


    Singleton()

    {

    }


    public static Singleton Instance

    {

        get

        {

            if (instance == null)

            {

                lock (padlock)

                {

                    if (instance == null)

                    {

                        instance = new Singleton();

                    }

                }

            }

            return instance;

        }

    }

}

4、不完全lazy,但是线程安全且不用用锁 推荐使用

public sealed class Singleton

{

    private static readonly Singleton instance = new Singleton();


    // 显示的static 构造函数

    //没必要标记类型 – 在field初始化以前

    static Singleton()

    {

    }


    private Singleton()

    {

    }


    public static Singleton Instance

    {

        get

        {

            return instance;

        }

    }

}




我爱CSharp学习网 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#开发模式——单例模式
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址