今天说一下设计模式中的单例模式的学习心得。
应该说单例模式简单而不简约,还是有需要注意的地方。
我们先看一下第一种单例模式:
public class Singleton {private Singleton() { } //私有化构造函数,防止被初始化 private static readonly object _lockhelper = new object(); //Lock提供线程安全的唯一对象private static volatile Singleton _singlteon;public static Singleton Instance {get {if (_singlteon == null) //双重判断,是为了提高单例对象被多次调用的性能,如果Lock之前没有判断,单例将每次都被Lock一次 {lock (_lockhelper) //线程安全,防止多线程调用单例时,同时判断为真时进入,造成多个实例 {if (_singlteon == null) { _singlteon = new Singleton(); } } }return _singlteon; } } }这种单例模式也是最常用的,个人偏好于这种,没有歧义,易理解。其中多线程调用单例的Instance时,加了一个volatile修饰,是为了优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
顺便附上volatile常用的几个情况:
1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量
再看第二种,最简单:
public class Singleton {private Singleton() { } //私有化构造函数,防止被初始化private static readonly Singleton Instance = new Singleton(); }也可以理解为
public class Singleton {private Singleton() { } //私有化构造函数,防止被初始化static Singleton() { Instance = new Singleton(); }private static readonly Singleton Instance; }静态构造函数在该类的静态字段使用前被调用。该种单例模式扩展比较差,例如带参数的单例。
最后看一下第三种单例模式
public class Singleton {private Singleton() { } //私有化构造函数,防止被初始化public static Singleton Instance { get {return Nested._instance; } }private class Nested {static Nested() { }internal static readonly Singleton _instance = new Singleton(); } }这里我们把初始化工作放到Nested类中的一个静态成员来完成,这样就实现了延迟初始化。今天的日记就到这,就到这
转载于:https://www.cnblogs.com/sanvey/archive/2012/02/03/2337400.html
相关资源:数据结构—成绩单生成器