在构建应用程序时,需要实现唯一实例化对象的类,并提供该实例的全局访问入口,以性能和框架能力为前提,还要考虑线程安全。
单件模式实现方式之一:简单实现,存在线程安全问题。
public sealed class Singleton { private static Singleton instance; private Singleton() { } /// <summary> /// 获取单件实体方法 /// </summary> /// <returns>单件实体</returns> public static Singleton GetInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
单件模式实现方式之二:由框架支持的方式,通过static和readonly的组合实现线程安全。微软的单件实现策略之一——静态初始化。
本方式是“设计模式:可重用面向对象软件元素[Gamma95]”的推荐方式,只是利用了C#的语言特性。
public sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } /// <summary> /// 获取单件实体方法 /// </summary> /// <returns>单件实体</returns> public static Singleton GetInstance() { return instance; } }
单件模式实现方式之三:通过标记为同步方法同时只有一个线程能够进入,不过同步操作是非常昂贵的操作,阻塞会导致性能损耗。
public sealed class Singleton { private static Singleton instance; private Singleton() { } /// <summary> /// 获取单件实体方法 /// </summary> /// <returns>单件实体</returns> [MethodImpl(MethodImplOptions.Synchronized)] public static Singleton GetInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
单件模式实现方式之四:多线程的单件实现方式,避免了昂贵的同步操作,双重检查锁定方法避免阻塞和冲突的发生。
public sealed class Singleton { private static Singleton instance; private static object syncLock = new object(); private Singleton() { } /// <summary> /// 获取单件实体方法 /// </summary> /// <returns>单件实体</returns> public static Singleton GetInstance() { if (instance == null) { lock (syncLock) { if (instance == null) instance = new Singleton(); } } return instance; } }
参考链接:
Implement Singleton in C# https://msdn.microsoft.com/en-us/library/ff650316.aspx
时间: 2024-10-10 15:45:49