欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

C#中的單例模式

一般的,設(shè)計(jì)模式中用到單例模式,代碼通常會(huì)如下:

成都一家集口碑和實(shí)力的網(wǎng)站建設(shè)服務(wù)商,擁有專(zhuān)業(yè)的企業(yè)建站團(tuán)隊(duì)和靠譜的建站技術(shù),10多年企業(yè)及個(gè)人網(wǎng)站建設(shè)經(jīng)驗(yàn) ,為成都1000+客戶(hù)提供網(wǎng)頁(yè)設(shè)計(jì)制作,網(wǎng)站開(kāi)發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營(yíng)銷(xiāo)型網(wǎng)站建設(shè),品牌網(wǎng)站制作,同時(shí)也為不同行業(yè)的客戶(hù)提供做網(wǎng)站、成都網(wǎng)站建設(shè)的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選創(chuàng)新互聯(lián)建站。

public sealed class Singleton
{
    private static Singleton instance=null;

    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            if (instance==null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

代碼比較簡(jiǎn)單,用到一個(gè)公有的靜態(tài)屬性和一個(gè)私有的靜態(tài)字段。并且把構(gòu)造函數(shù)設(shè)為私有,防止該類(lèi)被實(shí)例化。

但上述代碼在多線(xiàn)程情況下并不可靠。有一種情況下。2個(gè)線(xiàn)程在get的時(shí)候,都檢測(cè)到instance==null,因此各自創(chuàng)建了一個(gè)Singleton對(duì)象,破壞了單例的原則。

因此改進(jìn)后的代碼就是加鎖。

public sealed class Singleton
{
    private static Singleton instance = null;
    private static readonly object padlock = new object();

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }
}

加鎖之后,多線(xiàn)程的操作也變的同步了,同一時(shí)間只能有獲得鎖的那個(gè)線(xiàn)程才能創(chuàng)建對(duì)象。這保證了對(duì)象的唯一,但是這個(gè)會(huì)損耗性能。

因?yàn)槊看蝕et的時(shí)候,都會(huì)加鎖,因此可以把代碼修改一下,如果對(duì)象已經(jīng)存在了,就不需要加鎖來(lái)創(chuàng)建對(duì)象。代碼修改如下:

public sealed class Singleton
{
    private static volatile Singleton instance = null;
    private static readonly object padlock = new object();

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}

仔細(xì)看一下,就會(huì)發(fā)現(xiàn),上述代碼中,有2次檢測(cè)instance == null,因此也成為雙重檢測(cè)。注意,由于Java中內(nèi)存模型的問(wèn)題,上述雙重檢測(cè)代碼,對(duì)Java不一定有效。

在C#代碼中,考慮下面的場(chǎng)景,有2個(gè)線(xiàn)程A,B

1.A線(xiàn)程進(jìn)入get

2.A線(xiàn)程檢測(cè)到instance==null

3.A線(xiàn)程獲得鎖

4.A線(xiàn)程實(shí)例化一個(gè)對(duì)象

5.B線(xiàn)程進(jìn)入get

6.B線(xiàn)程檢測(cè)是否instance==null

問(wèn)題出現(xiàn)在第4,5,6步驟。

當(dāng)?shù)?步執(zhí)行的時(shí)候,很有可能出現(xiàn)這種情況,CLR為Singleton對(duì)象在托管堆上分配了空間,并且讓instance指向了這個(gè)空間,然后再去調(diào)用Singleton的構(gòu)造函數(shù)。而漏洞就在這里,線(xiàn)程B可能未等到線(xiàn)程A運(yùn)行完Singleton的構(gòu)造函數(shù),就進(jìn)入get檢測(cè)instance!=null,認(rèn)為對(duì)象不是null,然后就直接返回instance,而此時(shí),instance指向的值還在初始化呢,這就可能導(dǎo)致線(xiàn)程B得到的對(duì)象是沒(méi)完全初始化成功的,可能引起代碼錯(cuò)誤。當(dāng)然,這種錯(cuò)誤的可能性非常少見(jiàn),但還是會(huì)有一定的概率。

因此,上述代碼中instance變量加了一個(gè)關(guān)鍵字volatile,加它的作用,是為了訪(fǎng)問(wèn)這個(gè)instance的時(shí)候,確保instance分配了空間并且初始化完成了(volatile確保該字段在任何時(shí)間呈現(xiàn)的都是最新的值)。

如果不使用volatile關(guān)鍵字,也可以將instance = new Singleton();語(yǔ)句替換成Interlocked.Exchange(ref instance,new Singleton())。

在C#中,對(duì)于實(shí)現(xiàn)單例模式,更為推崇的方法是使用靜態(tài)變量初始化。

有些設(shè)計(jì)模式的書(shū)中,避免使用靜態(tài)初始化的原因之一是C++ 規(guī)范在靜態(tài)變量的初始化順序方面留下了一些多義性。幸運(yùn)的是,.NET Framework 通過(guò)其變量初始化處理方法解決了這種多義性:

public sealed class Singleton
{
   private static readonly Singleton instance = new Singleton();
   
   private Singleton(){}

   public static Singleton Instance
   {
      get 
      {
         return instance; 
      }
   }
}

CLR保證了靜態(tài)字段初始化操作總是線(xiàn)程安全的,無(wú)論多少線(xiàn)程同時(shí)訪(fǎng)問(wèn)該類(lèi),類(lèi)中的靜態(tài)字段只可能被初始化一次(每個(gè)應(yīng)用程序域)。

這是因?yàn)?,?lèi)中的靜態(tài)字段的初始化,是由類(lèi)的靜態(tài)構(gòu)造函數(shù)完成的,C#編譯器檢測(cè)到類(lèi)中有靜態(tài)字段后,會(huì)為該類(lèi)生產(chǎn)一個(gè)靜態(tài)構(gòu)造函數(shù)(可以從IL代碼中看到.cctor方法),也就是說(shuō)下面代碼是等價(jià)的:

class SomeType{
    Static int x = 5;
    }

等價(jià)于

class SomeType
{
    Static int x;
    Static SomeType()
    {
        x = 5;
    }
}

因此上述的instance只會(huì)初始化一次。保證了單例。這種方法使用了CLR的特性,對(duì)于其他語(yǔ)言并不保證,是.NET平臺(tái)上推崇的一種實(shí)現(xiàn)singleton的方式。

上述實(shí)現(xiàn)方法有個(gè)不足在于不能延遲加載對(duì)象,如果Singleton中還有其他靜態(tài)字段,引用該靜態(tài)字段的時(shí)候,會(huì)導(dǎo)致Singleton被創(chuàng)建了。因此,可以在該類(lèi)中再嵌套一個(gè)類(lèi)來(lái)實(shí)現(xiàn)延遲加載。如下:

public sealed class Singleton
{
    private Singleton()
    {
    }

    public static Singleton Instance { get { return Nested.instance; } }
        
    private class Nested
    {
        internal static readonly Singleton instance = new Singleton();
    }
}

上述代碼,只有當(dāng)訪(fǎng)問(wèn)Instance屬性的時(shí)候,才會(huì)觸發(fā)Nested類(lèi)的靜態(tài)字段,從而初始化一個(gè)Singleton對(duì)象,因此實(shí)現(xiàn)了延遲加載,但是設(shè)計(jì)比較復(fù)雜,不推薦使用。

在.NET4.0中,還有一種更優(yōu)雅的方法實(shí)現(xiàn)延遲加載,即使用Lazy<T>對(duì)象。

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

    private Singleton()
    {
    }
}

可以參考之前總結(jié)的文章http://cnn237111.blog.51cto.com/2359144/1213187


參考:

http://csharpindepth.com/Articles/General/Singleton.aspx#unsafe

http://msdn.microsoft.com/en-us/library/ff650316.aspx

http://mcwilling.blog.163.com/blog/static/1950971712013357359564/

NET4.0面向?qū)ο缶幊搪劵A(chǔ)篇.金旭亮

新聞名稱(chēng):C#中的單例模式
瀏覽地址:http://chinadenli.net/article2/jeejic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作ChatGPT、虛擬主機(jī)網(wǎng)站內(nèi)鏈、網(wǎng)站收錄外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
国产精品一区二区有码| 日韩国产精品激情一区| 日韩人妻一区中文字幕| 日本一二三区不卡免费| 中文字幕免费观看亚洲视频| 亚洲国产成人av毛片国产| 五月的丁香婷婷综合网| 日韩人妻av中文字幕| 日韩av欧美中文字幕| 邻居人妻人公侵犯人妻视频| 日本加勒比在线观看一区| 一区二区三区亚洲国产| 亚洲最新中文字幕一区| 国产一区在线免费国产一区| 婷婷开心五月亚洲综合| 中文字幕乱码免费人妻av| 男人和女人草逼免费视频| 日韩特级黄片免费观看| 中文字幕精品人妻一区| 99视频精品免费视频| 国产麻豆一线二线三线| 亚洲男人天堂成人在线视频 | 亚洲中文字幕高清乱码毛片| 国产成人亚洲综合色就色| 婷婷亚洲综合五月天麻豆| 欧美成人高清在线播放| 尤物久久91欧美人禽亚洲| 噜噜中文字幕一区二区| 国产一级内射麻豆91| 国产亚洲不卡一区二区| 少妇福利视频一区二区| 免费在线成人午夜视频| 中文字幕日韩欧美亚洲午夜 | 国产a天堂一区二区专区| 日韩精品免费一区三区| 夜色福利久久精品福利| 日韩夫妻午夜性生活视频| 国产偷拍盗摄一区二区| 国内精品伊人久久久av高清| 黄色片国产一区二区三区| 99国产成人免费一区二区|