你的位置:首页 > ASP.net教程

[ASP.net教程]C#浅析单例模式


第一次写博客,写的不好休怪哈。

 

版本1:最简单的单例模式

方法一:

public class MySingleton  {    private MySingleton() //构造函数,注意private    {    }    private static MySingleton _Entity = null; //私有字段    public static MySingleton Entity //公共属性    {      get      {        if (_Entity == null) //确保只能创建一次对象        {          MySingleton._Entity = new MySingleton();        }        return MySingleton._Entity;      }    }  }

 

方法二:

public class MySingleton  {    private MySingleton() //构造函数,注意private    {    }    private static MySingleton _Entity = null; //私有字段    public static MySingleton GetEntity() //公有方法    {      if (_Entity == null) //确保只能创建一次对象      {        MySingleton._Entity = new MySingleton();      }      return MySingleton._Entity;    }  }

 

两点:1)保证所有构造函数不被外部所调用;2)利用属性或者方法调用对象。

缺点:无法保证线程的安全性,多个线程的情况下可能创建多个对象。

 

版本2:线程安全的单例模式 

 public class MySingleton  {    private MySingleton() //构造函数,注意private    {    }    private static readonly object obj = new object();    private static MySingleton _Entity = null; //私有字段    public static MySingleton Entity //公共属性    {      get      {        lock (obj) //确保同一时刻,加锁的代码段只能被一个线程执行        {          if (_Entity == null) //确保只能创建一次对象          {            MySingleton._Entity = new MySingleton();          }        }        return MySingleton._Entity;      }    }  }

 

缺点:无论对象是否已经被创建,都要进行加锁,增加了不必要的开销。

 

版本3:Double-Checked Locking  

public class MySingleton  {    private MySingleton() //构造函数,注意private    {    }    private static readonly object obj = new object();    private static MySingleton _Entity = null; //私有字段    public static MySingleton Entity //公共属性    {      get      {        if (_Entity == null) //第一次检验,用于减少不必要的加锁        {          lock (obj) //确保同一时刻,加锁的代码段只能被一个线程执行          {            if (_Entity == null) //第二次检验,确保只能创建一次对象            {              MySingleton._Entity = new MySingleton();            }          }        }        return MySingleton._Entity;      }    }  }

 

这种方法既保证了线程的安全,又减少了加锁带来的不必要的开销。