最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

什么是單例模式?

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

簡單的思路就是, 創(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)建這個對象實(shí)例的時候, 會被多次創(chuàng)建, 這個時候, 對代碼改進(jìn)一下。

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)建這個對象的實(shí)例, 在第二次,對象命名已經(jīng)被創(chuàng)建了, 盡管只創(chuàng)建了一次滿足了我們的需求, 但是我們已知對象被創(chuàng)建了, 還需要進(jìn)來做不必要的動作嗎?

我們都知道, 同步鎖為了達(dá)到預(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é)果:

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

利用靜態(tài)變量實(shí)現(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)變量去實(shí)現(xiàn)單例, 由CLR保證,在程序第一次使用該類之前被調(diào)用,而且只調(diào)用一次

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

利用靜態(tài)構(gòu)造函數(shù)實(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)變量一樣, 它會隨著程序運(yùn)行, 就被實(shí)例化, 同靜態(tài)變量一個道理。

單例模式中的延遲加載

延遲加載或延遲加載是一種設(shè)計(jì)模式,或者您可以說這是一個概念,通常用于將對象的初始化延遲到需要時。因此,延遲加載的主要目標(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#實(shí)現(xiàn)單例模式的多種方式的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#基于HttpWebRequest實(shí)現(xiàn)發(fā)送HTTP請求的方法分析

    C#基于HttpWebRequest實(shí)現(xiàn)發(fā)送HTTP請求的方法分析

    這篇文章主要介紹了C#基于HttpWebRequest實(shí)現(xiàn)發(fā)送HTTP請求的方法,結(jié)合實(shí)例形式分析了C#使用HttpWebRequest類與System.IO類實(shí)現(xiàn)發(fā)送HTTP請求相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-02-02
  • C#串口編程System.IO.Ports.SerialPort類

    C#串口編程System.IO.Ports.SerialPort類

    這篇文章介紹了C#串口編程System.IO.Ports.SerialPort類,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Json操作庫DynamicJson使用指南

    Json操作庫DynamicJson使用指南

    本文給大家分享的是專門為.NET程序員開發(fā)的Json操作庫DynamicJson,其源碼非常簡單,僅僅只有400行代碼,一個對應(yīng)的class類,目前只支持.NET 4.0以上的.NET Framework。
    2016-09-09
  • C#實(shí)現(xiàn)簡單超市收銀系統(tǒng)

    C#實(shí)現(xiàn)簡單超市收銀系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡單超市收銀系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C# foreach獲取循環(huán)索引的四種方法

    C# foreach獲取循環(huán)索引的四種方法

    在C#中使用foreach循環(huán)的時候我們有時會碰到需要索引的情況,在for循環(huán)中我們可以得到循環(huán)索引 , foreach并不直接提供 , 下面介紹4種foreach獲取索引的方法,希望對大家有用處,需要的朋友可以參考下
    2025-03-03
  • Unity實(shí)現(xiàn)鼠標(biāo)或者手指點(diǎn)擊模型播放動畫

    Unity實(shí)現(xiàn)鼠標(biāo)或者手指點(diǎn)擊模型播放動畫

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)鼠標(biāo)或者手指點(diǎn)擊模型播放動畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • C#實(shí)現(xiàn)改變DataGrid某一行和單元格顏色的方法

    C#實(shí)現(xiàn)改變DataGrid某一行和單元格顏色的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)改變DataGrid某一行和單元格顏色的方法,主要涉及DataGrid控件的添加與使用、數(shù)據(jù)源的綁定、單元格與行的獲取等操作。需要的朋友可以參考下
    2014-09-09
  • 一篇文章看懂C#中的協(xié)變、逆變

    一篇文章看懂C#中的協(xié)變、逆變

    這篇文章主要給大家介紹了如何通過一篇文章看懂C#中協(xié)變、逆變的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • C#調(diào)用系統(tǒng)API指定快捷鍵的方法

    C#調(diào)用系統(tǒng)API指定快捷鍵的方法

    這篇文章主要介紹了C#調(diào)用系統(tǒng)API指定快捷鍵的方法,涉及C#快捷鍵的操作技巧,需要的朋友可以參考下
    2015-06-06
  • C#對集合進(jìn)行排序

    C#對集合進(jìn)行排序

    這篇文章介紹了C#對集合進(jìn)行排序的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論

格尔木市| 扶风县| 五华县| 罗田县| 梅河口市| 行唐县| 青龙| 安新县| 泰和县| 砚山县| 奇台县| 洛浦县| 灵璧县| 正安县| 贵港市| 视频| 丽水市| 邵阳市| 恩平市| 衡山县| 伊川县| 巫山县| 紫云| 轮台县| 井研县| 西充县| 临沭县| 理塘县| 中牟县| 砀山县| 元朗区| 寿宁县| 普兰店市| 镇原县| 平罗县| 建德市| 肃北| 清丰县| 错那县| 宝坻区| 常熟市|