几种常用的C#线程安全的单例方式
整理了几种常用的C#线程安全的单例方式
namespace SafeSingleton { /// <summary> /// 线程安全的单例方式:CAS /// </summary> class Singleton_CAS { private static Singleton_CAS single; public static Singleton_CAS Singleton() { if (single != null) return single; System.Threading.Interlocked.CompareExchange(ref single, new Singleton_CAS(), null); return single; } } /// <summary> /// 线程安全的单例方式:Lazy加载 /// </summary> class Singleton_Lazy { public static Singleton_Lazy Singleton() { return single.Value; } private static readonly System.Lazy<Singleton_Lazy> single = new System.Lazy<Singleton_Lazy>(() => new Singleton_Lazy()); } /// <summary> /// 线程安全的单例方式:静态内部类-懒汉/饿汉模式 /// </summary> class Singleton_StaticClass { //public static Singleton_StaticClass Singleton => InnerClass.single;//饿汉模式 public static Singleton_StaticClass Singleton() { return InnerClass.single; }//懒汉模式 private static class InnerClass { internal static Singleton_StaticClass single = new Singleton_StaticClass(); } } /// <summary> /// 线程安全的单例方式:双重校验-懒汉模式 /// </summary> class Singleton_DoubleCheck { private static readonly object lockObj = new object(); private static Singleton_DoubleCheck single; public static Singleton_DoubleCheck Singleton() { if (single == null) { //System.Threading.Monitor.Enter(lockObj); lock (lockObj) { if (single == null) { single = new Singleton_DoubleCheck(); } }
//System.Threading.Monitor.Exit(lockObj); } return single; } } /// <summary> /// 线程安全的单例方式:静态只读字段-饿汉模式 /// </summary> class Singleton_StaticReadonlyField { private static readonly Singleton_StaticReadonlyField single = new Singleton_StaticReadonlyField(); public static Singleton_StaticReadonlyField Singleton() { return single; } } }
浙公网安备 33010602011771号