题目详解:只能生成一个实例的类,,就是实现了singleton模式的类型
为了达到只能生成一个实例的目的,我们必须把类的构造函数声明为私有来禁止其他人创建实例。
public sealed class Singleton
{
private Singleton()//把构造函数定义为私有函数
{
}
private static object sycObj=new object();//设置同步锁,预防多线程情况下,两个线程同时创建实例,加上同步锁之后,在一个时刻只有一个线程能得到同步锁,另一个线程只能等待
private static Singleton instance=NULL;//只有在instance为空时,才能创建一个实例避免重复创建。
public static Singleton Instance
{
get
{
if(instance==null)
{
lock(syncObj)
{
if(instance==null)
{
if(instance==null)
{
instance=new Singletion();
}
}
return instance;
}
}
}
当instance 为null时,也就是还没有创建时,需要进行加锁操作,创建出来之后,则无需加锁。这个解法使用加锁机制来确保在多线程下只创建一个,实例,两个if实现了比较好的效率。然后代码稍微有点复杂,编写代码时容易出错。
下面是比较优秀的解法
C#中静态构造函数能够确保只调用一次,利用好此方法,能够以简短的代码来实现这个题目
public sealed class Singleton
{
private Singleton
{
}
private static Singleton instance=new Singleton();
public static Singleton Instance
{
get
{
return instance ;
}
}
}
在这个方法中,实例instance在第一次使用到Singleton时就会被创建,假设在singleton里面添加一个静态方法,调用该静态方法是不用在创建一个实例的,
这个方法虽然简单,但是,但是过早地创建实例。会让内存使用效率降低。
下面介绍的这种方法,解决了上面过早创建实例的问题,实现了按需创建实例
public sealed class Singleton
{
Singleton
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
static Nested
{
}
internal static readonly Singleton instance =new Singleton();
}
}
只有当我们通过Singleton.Instance来得到Singleton 的实例时,才会调用nested的静态构造函数来创建实例instance,当我们不调用Singleton,Instance 时,nested不会被调用,也不会创建实例。
结论:第一种方法,两次判断和一次加锁确保多线程下高效率的工作
第二种方法,利用C#静态构造函数的特性,第三种方法利用私有嵌套类型的特性,按需创建,提高了空间使用效率。
PS:本人最近在复习相关的知识,看到相关的题目觉得值得分享,若有错误欢迎指正。