C#单例模式的2种实现方式,Lazy模式和双检锁模式

public class MyClass
    {
        //volatile 关键字指示一个字段可以由多同时执行的线程修改。 声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。 这样可以确保该字段在任何时间呈现的都是最新的值。
        private static volatile MyClass _instance;
        private static readonly object InstanceLock = new object();
        public static MyClass Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (InstanceLock)
                    {
                        if (_instance != null)
                        {
                            return _instance;
                        }
                        _instance = new MyClass();
                    }
                }

                return _instance;
            }
        }

        //在.NET 中这种模式已用 Lazy<T>类实现了封装,内部就是使用了双检锁模式。 你最好还是使用 Lazy<T>,不要去实现自己的双检锁模式了。这样非常的简洁
        public static MyClass Instance2 = new Lazy<MyClass>(() => new MyClass()).Value;
    }

    class Program
    {


        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                Thread th = new Thread(() => { Console.WriteLine("线程调用对象{0}", MyClass.Instance.GetHashCode()); });
                th.Start();
            }
            for (int i = 0; i < 10; i++)
            {
                Thread th = new Thread(() => { Console.WriteLine("线程调用对象{0}", MyClass.Instance2.GetHashCode()); });
                th.Start();
            }

            Console.ReadLine();
        }

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值