在做工程的时候,有时候就需要实例化一个对象。在学习中发现是使用的单列模式,边学习一下记录下来。
单列模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点
class Singleton
{
private static Singleton instance;
private Singleton()
{
}
public static Singleton GetInstace()
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
}
构造方法让其private,这就堵死了外界利用new创建此类实例的可能
方法是获得本类实例的唯一全局访问点
若实例不存在,则new一个新实例,否则返回已有的实例。
客户端的代码
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstace();
Singleton s2 = Singleton.GetInstace();
if(s1 == s2)
{
Console.WriteLine("两个对象是相同的实例");
}
Console.Read();
}
单例模式是因为Singleton 类封装它的唯一实例,这样它可以严格地控制客户端怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。
多线程时的单例
lock 是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放。
双层锁定
public class Singleton {
private static volatile Singleton singleton;
private static readonly object syncRoot = new object();
private Singleton() {}
public static Singleton getInstance()
{
if (singleton == null)
{
lock (syncRoot)
{
if (singleton == null)
{
singleton = new Singleton();
}
}
}
return singleton;
}
}
程序运行时创建一个静态只读的进程辅助对象
在同一时刻加了锁的那部分,程序只有一个线程可以进入