亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#實現(xiàn)單例模式的多種方式

 更新時間:2022年01月25日 10:09:28   作者:痕跡g  
這篇文章介紹了C#實現(xiàn)單例模式的多種方式,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

什么是單例模式?

這里我就不做過多的解釋了, 畢竟關(guān)于Singleton的資料實在是太多太多了。點擊這里

簡單的思路就是, 創(chuàng)建對象單例的動作轉(zhuǎn)移到另外的行為上面, 利用一個行為去創(chuàng)建對象自身, 如下:

public class Singleton
    {
       private Sington() { }
        private static Singleton _Singleton = null;
        public static Singleton CreateInstance()
        {
            if (_Singleton == null)
            {
             Console.WriteLine("被創(chuàng)建");
             _Singleton = new Singleton();
            }
            return _Singleton;
        }
    }

這樣寫看上去是沒有問題, 但是有沒有那種可能, 同時兩個動作都判斷這個對象為空, 那么這個對象就會被創(chuàng)建2次?是的, 多線程中, 這樣是無法保證單例。

就像這樣, 同時創(chuàng)建多個線程去創(chuàng)建這個對象實例的時候, 會被多次創(chuàng)建, 這個時候, 對代碼改進一下。

public class Singleton
    {
       private Sington() { }
        private static Singleton _Singleton = null;
        private static object Singleton_Lock = new object(); //鎖同步
        public static Singleton CreateInstance()
        {
                lock (Singleton_Lock)
                {
            Console.WriteLine("路過");
                    if (_Singleton == null)
                    {
              Console.WriteLine("被創(chuàng)建");
                        _Singleton = new Singleton();
                    }
                }
            return _Singleton;
        }
    }

調(diào)試代碼:

                TaskFactory taskFactory = new TaskFactory();
                List<Task> taskList = new List<Task>();

                for (int i = 0; i < 5; i++)
                {
                    taskList.Add(taskFactory.StartNew(() =>
                     {
                         Singleton singleton = Singleton.CreateInstance(); 
                     }));
                }

結(jié)果:

上面, 我們創(chuàng)建了多個線程,同時去創(chuàng)建這個對象的實例, 在第二次,對象命名已經(jīng)被創(chuàng)建了, 盡管只創(chuàng)建了一次滿足了我們的需求, 但是我們已知對象被創(chuàng)建了, 還需要進來做不必要的動作嗎?

我們都知道, 同步鎖為了達到預(yù)期的效果, 也是損耗了性能的, 那么下面的輸出, 很顯然是沒必要的動作, 所以我們優(yōu)化一下。

    public class Singleton
    {
        private static Singleton _Singleton = null;
        private static object Singleton_Lock = new object();
        public static Singleton CreateInstance()
        {
            if (_Singleton == null) //雙if +lock
            {
                lock (Singleton_Lock)
                {
                    Console.WriteLine("路過。");
                    if (_Singleton == null)
                    {
                        Console.WriteLine("被創(chuàng)建。");
                        _Singleton = new Singleton();
                    }
                }
            }
            return _Singleton;
        }
    }

結(jié)果:

很顯然, 這樣達到了我們的預(yù)期, 對象在被創(chuàng)建后, 就沒必要做多余的行為。

利用靜態(tài)變量實現(xiàn)單例模式

 public sealed class Singleton
    {
        private Singleton() { }

        private static readonly Singleton singleInstance = new Singleton();

        public static Singleton GetInstance
        {
            get
            {
                return singleInstance;
            }
        }
    }

是不是覺得很優(yōu)雅, 利用靜態(tài)變量去實現(xiàn)單例, 由CLR保證,在程序第一次使用該類之前被調(diào)用,而且只調(diào)用一次

PS: 但是他的缺點也很明顯, 在程序初始化后, 靜態(tài)對象就被CLR構(gòu)造了, 哪怕你沒用。

利用靜態(tài)構(gòu)造函數(shù)實現(xiàn)單例模式

 public class SingletonSecond
    {
        private static SingletonSecond _SingletonSecond = null;

        static SingletonSecond()
        {
            
            _SingletonSecond = new SingletonSecond();
        }
        
        public static SingletonSecond CreateInstance()
        {
            return _SingletonSecond;
        }
    }

靜態(tài)構(gòu)造函數(shù):只能有一個,無參數(shù)的,程序無法調(diào)用 。

同樣是由CLR保證,在程序第一次使用該類之前被調(diào)用,而且只調(diào)用一次。同靜態(tài)變量一樣, 它會隨著程序運行, 就被實例化, 同靜態(tài)變量一個道理。

單例模式中的延遲加載

延遲加載或延遲加載是一種設(shè)計模式,或者您可以說這是一個概念,通常用于將對象的初始化延遲到需要時。因此,延遲加載的主要目標(biāo)是按需加載對象,或者您可以根據(jù)需要說出對象。

作為 .NET Framework 4.0 的一部分引入的惰性關(guān)鍵字為惰性初始化(即按需對象初始化)提供了內(nèi)置支持。如果要使對象(如 Singleton)以延遲初始化,則只需將對象的類型(單例)傳遞給lazy關(guān)鍵字,如下所示。

private static readonly Lazy<Singleton> Instancelock = new Lazy<Singleton>(() => new Singleton());
 public sealed class Singleton
     {
         private Singleton()
         {}
 
         private static readonly Lazy<Singleton> Instancelock =
                     new Lazy<Singleton>(() => new Singleton());
 
         public static Singleton GetInstance
         {
             get
             {
                 return Instancelock.Value;
             }
         }
     }

到此這篇關(guān)于C#實現(xiàn)單例模式的多種方式的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論