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

1、单例模式简介数据库

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

2、单例模式的核心函数

单例类只有一个实例存在性能

单例类提供一个全局访问点测试

单例类经过本身建立惟一实例网站

单例类对外全部访问对象都提供一个惟一实例。spa

3、单例模式的优势线程

一、在程序运行中只有一个实例,减小内存占用,减小频繁的建立和销毁实例所带来的系统开销,设计

二、避免资源的多种无效占用日志

单例模式缺点:

没有接口 不能继承

4、单例模式应用场景

当一个事物在特定的环境中,只会存在一个实例时,咱们能够采用单例模式对其进行设计。

例: 数据库链接池,计算机注册表 一个国家只有一个总统 日志系统中的日志文件 计算机中的打印池 计算机设备管理器

生成惟一序列号 网站计数器

5、单例模式的实现方式

一、非线程安全(尽可能不要用)

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为空的而且这里返回真的状况下,均可以建立实例,这显然违反了单例模式,实际上,在测试之前,实例就已经有可能被建立了,

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

二、简单的线程安全

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 释放之后发生的),这样就保证了一个线程只能建立一个实例(每次只有一个线程在这段代码中运行),不巧的是,性能上来讲,锁变成了每次都必须的当这个实例被响应的时候。

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

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;

}

}

}

 

四、不彻底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;

}

}

}

 

 

欢迎关注个人公众号(同步更新文章)DoNet技术分享平台

阅读原文

相关文章
相关标签/搜索