1. 程式人生 > >201802140000->深入淺出設計模式:c#高併發下單例模式

201802140000->深入淺出設計模式:c#高併發下單例模式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;


namespace _002懶漢式單例模式
{
    public class Singleton<T> where T : Singleton<T>, new()
    {
        private static T instance = null;
        private static readonly object mylock = new object();


        protected Singleton()
        {
        }


        public static T Instance
        {
            get
            {
                //利用雙鎖模式避免高併發下非單例模式
                if (instance == null)
                {
                    lock (mylock)
                    {
                        if (instance == null)
                        {
                            instance = Activator.CreateInstance(typeof(T)) as T;
                        }
                    }
                }
                return instance;
            }
        }
    }


    public class test : Singleton<test>
    {
        public test()
        {
        }


        public void HelloWorld()
        {
            Console.WriteLine(this.GetHashCode());
        }
    }


    internal class Program
    {
        private static void Main(string[] args)
        {
            test t1 = test.Instance;
            t1.HelloWorld();
            test t2 = test.Instance;
            t2.HelloWorld();
            /*
             * 在高併發的情況下
             *
             * lock前後有可能一瞬間生成物件
             *
             * 所以利用單鎖雙判定規避非單例事件
             *
             * 關鍵理解lock以及雙判定模式
             */
            Console.ReadKey();
        }
    }
}