C#下的单例实现

最普通的一种:

以下是引用片段:

using System;
public class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
}

这种方案在.net下面是线程不安全的,每个线程进来会创建不同的类型实例。

下面是一种在.Net公共语言运行环境下的线程安全单例实现模式:

以下是引用片段:

public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
private Singleton(){}
public static Singleton Instance
{
get
{
return instance;
}
}
}

它是依靠公共语言运行时的能力来构造的线程安全模式,在别的语言环境中是不适用的。

基于此加上.Net对泛型的支持,我们可以做一个通用的泛型单例Provider, 代码如下:

以下是引用片段:

public class SingletonProvider where T : new()
{
SingletonProvider() { }
public static T Instance
{
get { return SingletonCreator.instance; }
}
class SingletonCreator
{
static SingletonCreator() { }
internal static readonly T instance = new T();
}
}

在此应用下,单例的实例由CLR保证只在首次引用它时才会被创建。

当它不能满足需要时,比如:你需要在构造函数中做一些其它的操作完成初始化的话,那么就可以考虑使用Double-checked locking模式来实现。

一个线线程安全的单例:

以下是引用片段:

using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}

需要注意的时,这里锁定的是syncRoot,而不是本身,这可以避免产生死锁。

在其它的语言环境中,Double-Checked Locking不一定能正常工作,这是由于编译器本身的问题产生的,所以上面的实现方法并不一定适用于其它的语言环境。

时间: 2024-12-28 16:11:27

C#下的单例实现的相关文章

关于Java单例对象同步问题

单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.正是由于这个特点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息.例如在某个服务器程序中,该服务器的配置信息可能存放在数据库或文件中,这些配置数据由某个单例对象统一读取,服务进程中的其他对象如果要获取这些配置信息,只需访问该单例对象即可.这种方式极大地简化了在复杂环境下,尤其是多线程环境下的配置管理,但是随着应用场景的不同,也可能带来一些同步

【java设计模式】之 单例(Singleton)模式

1. 单例模式的定义         单例模式(Singleton Pattern)是一个比较简单的模式,其原始定义如下:Ensure a class has only one instance, and provide a global point of access to it. 即确保只有一个实例,而且自行实例化并向整个系统提供这个实例.单例模式的通用类如下图所示:         Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行

NodeJS中的模块是单例的吗?

本文翻译自 Lazlojuly 的 are-node-js-modules-singletons. 本文从属于笔者的NodeJS入门与最佳实践中的NodeJS 基础系列文章,包括NodeJS 入门.NodeJS 模块导出与解析.NodeJS IOStream.NodeJS HTTPS这几部分. 笔者之前在使用require导入模块时,特别是在导入有状态的模块时,笔者会考虑其是否在多次导入情况下依然保持单例特性,或者说对于同一个文件在不同路径下导入时,是否能够识别为一致?本文即是对该特性进行解析.

ios-iOS能讲解下在继承uiview中该怎样用单例并传值

问题描述 iOS能讲解下在继承uiview中该怎样用单例并传值 最好有简单代码实例 真的十分感谢 就是自己写了单独的错误提示框 想实例化一次后 就不需要实例了 解决方案 错误提示框一般都是使用的时候显示,不使用的时候释放,这样比较合理,不要滥用单例,如果觉得每次实例化麻烦那就写个类方法,方法里面根据传入的字符串创建实例然后返回实例,你只需要在要用的类中去接收这个实例,然后控制显示和隐藏就好了 解决方案二: 那你可以单独写一个类用于处理,再分别引入就可以了.如果是单例你的警告内容更改也会比较麻烦

PHP单例:只在整个页面周期内唯一

由于asp.net是编译型的,所以单例一直会存在于这个应用程序的生命周期里,真正可以做到这个实例在应用程序生命周期中的唯一性. 单例模式的存在在一些情况下是比较有意义的,如BlogEngine的站点配置就是采用的单例模式,而且它的载入和保存的代码是相当经典的,有兴趣可以看看它的源代码. 由于asp.net是编译型的,所以单例一直会存在于这个应用程序的生命周期里,真正可以做到这个实例在应用程序生命周期中的唯一性. php的单例模式的实现大致如下: class Stat{       static

设计模式C#描述——单例与多例模式

设计 设计模式C#描述--单例与多例模式 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式有以下特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例. 一个典型的单例类的实现如下所示:其中构造子私有表示子类不能被继承. public class Singleton { private static Singleton m_instance = null; private

设计模式C#描述-单例与多例模式

作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式有以下特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例. 一个典型的单例类的实现如下所示:其中构造子私有表示子类不能被继承. public class Singleton{private static Singleton m_instance = null; private Singleton(){}public sta

PHP里的单例类写法实例

  这篇文章主要介绍了PHP里的单例类写法实例,本文直接给出代码实例,需要的朋友可以参考下 PHP里的单实例类在进行数据交换,节省内存上还是很有意义的.写个简单例子. 类1,单实例类本身: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class UTIL { private static $instance; public function get() { if (!self::$instance) { self::$instance = new UTIL(

asp.net中C++单例实现问题分析

  方案一  代码如下   class QMManager { public:     static QMManager &instance()     {         static QMManager instance_;         return instance_;     } } 这是最简单的版本,在单线程下(或者是C++0X下)是没任何问题的,但在多线程下就不行了,因为static QMManager instance_;这句话不是线程安全的. 在局部作用域下的静态变量在编译时