您当前的位置: 首页 >  安全

惊鸿一博

暂无认证

  • 4浏览

    0关注

    535博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

设计模式_单例模式回顾_C#版不使用锁保证多线程安全

惊鸿一博 发布时间:2021-01-03 16:25:34 ,浏览量:4

说明

采用加锁的方式,实现容易出错,效率也收到影响。

所以考虑使用.Net的特性, 即: C#在调用静态构造函数时,初始化静态变量,.net可以保证只调用一次静态构造函数。从而保证只初始化一次实例instance。

同时考虑到不过早的创建实例,实现按需创建实例,所以使用嵌套类,在类中再定义一个私有类型Nested,在该私有类型中调用它的静态构造函数创建实例instance。

代码 不使用锁保证多线程安全
    public sealed class Singleton5
    {
        Singleton5()
        {
            Console.WriteLine("An instance of Singleton5 is created.");
        }

        public static Singleton5 Instance
        {
            get
            {
                return Nested.instance;
            }
        }

        class Nested
        {
            static Nested()
            {
            }

            internal static readonly Singleton5 instance = new Singleton5();
        }
    }
加锁的方式
    public sealed class Singleton3
    {
        private Singleton3()
        {
        }

        private static object syncObj = new object();

        private static Singleton3 instance = null;
        public static Singleton3 Instance
        {
            get
            {
                if (instance == null) //此句判断放在lock前,为了避免每次都去抢锁,耗费时间
                {
                    lock (syncObj)
                    {
                        if (instance == null) //此处不能省,假设2个线程同时进入a的位置,第一个线程创建完成后,释放锁,第二个线程拿到锁,此时不判断==null,会再new一个新的对象出来。
                            instance = new Singleton3();
                    }
                }

                return instance;
            }
        }
    }

参考:剑指offer 第二版 面试题2

关注
打赏
1663399408
查看更多评论
立即登录/注册

微信扫码登录

0.0603s