几种常用的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; } } }

 

posted on 2023-02-20 12:39  鱼歌  阅读(206)  评论(0)    收藏  举报

导航