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#语言角度来讲,饿汉式单例类已经满足我们的需要了。
【单例模式 双重锁定 懒汉式单例类 饿汉式单例类】
推荐阅读
- 面试|我经历的IT公司面试及离职感受(转)
- java|设计模式——创建型——工厂方法(Factory Method)
- 设计模式|设计模式_创建型模式——工厂方法
- 设计模式|设计模式——创建型软件设计模式——工厂方法模式
- 设计模式之装饰器模式
- 设计模式之设计原则
- 设计模式六大原则(5)(迪米特法则 最少知道)
- 观察者模式实现之EventBus(Google)
- Java高级面试|常见设计模式——装饰模式
- java设计模式——单例模式