单例模式:
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
GetInstance是一个静态方法,主要负责创建自己的唯一实例,然后允许客户访问它的唯一实例。
多线程时的单例:解决的是同时访问Singleton类,可能造成创建多个实例的问题。
为了解决这个问题,可以给进程加把锁,lock,确保当一个线程位于代码的临界区时,另一个线程不进入临界区,如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放。
class Singleton { private static Singleton instance; private static readonly object syncRoot = new object(); private Singleton() { } public static Singleton GetInstance() { if (instance == null) //一重:先判断实例是否存在,再决定是否加锁 { lock (syncRoot) { if (instance == null)//二重:由于lock,只有一个可进入此,当一个将其实例化,则其它无必要再进入。同时避免多个实例化。 { instance = new Singleton(); } } } return instance; } }
这即双重锁定
另外解决多线程,还有一个实现更简单的方法:静态初始化:
public sealed class Singleton//sealed 阻止发生派生,而派生可能会增加实例 { private static readonly Singleton instance = new Singleton();//第一次引用类的任何成员时创建实例,公共语言运行库负责处理变量初始化。 private Singleton() { } public static Singleton GetInstance() { return instance; } }
像静态初始化,在自己被加载时就将自己实例化,这种方式被称为:饿汉式单例类。而像前面的单例模式,要在第一次被引用时,才将自己实例化,这种方式被称为:懒汉式单例类。
饿汉式是类一加载就实例化的对象,所以要提前占用系统资源。然而懒汉式,又会面临多线程访问的安全性问题。所以需用哪种模式,还需根据实际情况。
简言之:单例就是保证一个类仅有一个实例,并提供一个访问它的全局访问点。
原文地址:http://blog.csdn.net/onlybymyself/article/details/42060007