单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
我们来看一下单例模式下的饿汉模式代码:
/// <summary> /// 饿汉模式 /// </summary> public class Singleton { //私有的构造器 private Singleton() { } //私有的静态实例 private static Singleton instance = new Singleton(); public static Singleton GetInstance() { return instance; } }
懒汉模式代码:
/// <summary> /// 懒汉模式 /// </summary> public class Singleton2 { //私有的构造器 private Singleton2() { } //私有的静态实例 private static Singleton2 instance = null; public static Singleton2 GetInstance() { if (instance==null) { instance=new Singleton2(); } return instance; } }
饿汉模式和懒汉模式的区别:
饿汉模式加载类时比较慢,但运行时获取对象的速度比较快,线程安全的
懒汉模式加载类时比较快,但运行时获取对象的速度比较慢,线程不安全的
C# 下的单例模式:
1、线程不安全:
//C# 下的单例模式(线程不安全) public class Singleton3 { public static readonly Singleton3 instance = new Singleton3(); private Singleton3() { } }
上面的实现完全可以达到单例模式的意图,保证一个类仅且有一个实例,并提供一个全局访问点.而这在实际应用我们还得注意一点,就是在多线程的调用.于此,我们还得保证线程安全.要保证线程安全其实也是很简单就可以实现的,只需要通过加锁和双重判断就OK,下面是简单的多线程的线程安全的实现:
2、线程安全:
//C# 下的单例模式(线程安全) public class Singleton4 { /// <summary> /// 声明一个静态锁 /// </summary> private static object lockHelper = new object(); //私有构造函数 private Singleton4() { } //注意使用 volatile 关键字 private static volatile Singleton4 instance = null; //静态属性 public static Singleton4 Instance { get { if (instance == null) //双检查 { lock (lockHelper) { if (instance == null) { instance = new Singleton4(); } } } return instance; } } }