单例模式 双重锁定 懒汉式单例类 饿汉式单例类

lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

class Singleton { private static Singleton instance; private static readonly object syncRoot = new object(); // 程序运行时创建一个静态只读的进程辅助对象private Singleton() { } //构造方法让其private,这就毒死了外界利用new创建此类实例的可能。public static Singleton GetInstance()// 此方法是获得本类实例的唯一全局访问点 { if (instance == null)// 先判读实例是否存在,不存在再加锁处理 { lock (syncRoot) // 在同一个时刻加了锁的那部分程序只有一个线程可以进入 { if (instance == null) { instance = new Singleton(); } } } return instance; } }


以上是在第一次被引用的时,才会将自己实例化,所以就被成为 懒汉式单例类。



public sealed class Singleton// sealed 阻止发生派生,而派生可能会增加实例 { private static readonly Singleton instance = new Singleton(); /* readonly 在第一次引用类的任何成员时创建实例。由于instance变量被标记为readonly,这意味着只能在静态初始化期间或在类构造函数中分配变量。 由于这种静态初始化的方式是在自己被加载时将自己实例化,所以被称为饿汉式单例类 */private Singleton() { } // 由于构造方法是私有的,因此不能在类本身以外实例化Singleton类 public static Singleton GetInstance() { return instance; } }

从c#语言角度来讲,饿汉式单例类已经满足我们的需要了。

【单例模式 双重锁定 懒汉式单例类 饿汉式单例类】

    推荐阅读