• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            面對現實,超越自己
            逆水行舟,不進則退
            posts - 269,comments - 32,trackbacks - 0

                  singleton模式是Gof提出的23中模式之一,也稱為單例模式,那么簡單說一下,什么叫單例模式呢?
                  通常我們創建類的對象是使用new Object(),然后就調用該對象里面的方法,那么當我們多次使用new Object()的話,會對系統資源造成一種浪費,當然.net內部已經有垃圾回收機制可以處理這種浪費。當然我們并不會再程序里面多次使用new Object(),但是,作為一個類的設計者,我們需要負什么責任,除了讓別的模塊可以調用使用之外,我們的設計還需要一種規范,這也是OO里面的規范,singleton模式在這里派上了用場。

                  singleton模式的意圖:確保一個類只能擁有一個實例,并保證邏輯的正確性以及良好的效率,并提供一個該實例的全局訪問點。
                  singleton模式類型:單線程singleton,多線程singleton
                  singleton思路:要讓使用者只能使用一個實例的話,那么必須繞過常規的公有缺省構造器

                  singleton代碼:

             1 public class singleton
             2 {
             3     private static singleton instance;
             4     private singleton() { }
             5     public static singleton Instance
             6     {
             7         get
             8         {
             9             if (instance == null)
            10             {
            11                 instance = new singleton();
            12             }
            13             return instance;
            14         }
            15     }
            16 }
            17 

                  第4行:利用私有構造函數繞開系統自帶的缺省公有構造函數,這樣就使類的外部不可以直接使用new實例化對象
                  第5行:提供一個靜態的公有屬性,供類外部調用
                  第9行:在這里可能存在BUG,當有兩個線程同時操作公有屬性時,常規的話應該返回兩個一樣的實例,但是假如當第一個實例還未來得及創建時,第二個線程又訪問了它,顯然也會執行              new singleton()這個語句,那么這兩個對象的引用就不一樣了,可以使用object.ReferenceEquals測試一下對象的引用是否一樣。因此,給大家提供多線程方案,請看下面代碼

             1 public class singletons
             2 {
             3     private static volatile singletons instances = null;
             4     private static object lockHelper = new object(); 
             5     private singletons() { }
             6     public static singletons Instance
             7     {
             8         get
             9         {
            10             if(instances==null)
            11             {
            12                 lock (lockHelper)
            13                 {
            14                     if(instances==null )
            15                     {
            16                         instances = new singletons();
            17                     }
            18                 }
            19             }
            20             return instances;
            21         }
            22     }
            23 }

                  顯然看起來與單線程singleton差不多,多了volatile 修飾符,還有一個Object對象,接下來跟大家解釋使用這些其中的緣由
                  volatile 修飾符
                  假如我定義兩個變量和兩個屬性

             1  int a;
             2  volatile int b;
             3  public int GetFirst
             4  {
             5      get { return a; }
             6  }
             7  public int GetSecond
             8  {
             9      get { return b; }
            10  }

                  GetFirst會得到當前線程中a的值,而多個線程就會有多個a的變量拷貝,而且這些拷貝之間可以互不相同,換句話說,另一個線程可能改變了它線程內的a值,而這個值和當前線程中的a值不相同,那么就造成線程沖突了。
            那么再來看看b,因為volatile 修飾的變量不允許有不同于“主”內存區域的變量拷貝,換句話說,一個變量經volatile 修飾后在所有線程中都是同步的;任何線程改變了它的值,所以其他線程立即獲取到了相同的值,當然加了volatile 修飾的變量存儲時會比一般變量消耗的資源要多一點。

            Object對象鎖
                  對象鎖可以保證Lock里面的代碼只能同時讓一個線程執行,所以確保了一個對象只存在一個實例。

                  同樣的需求可以有不同的方法實現,以下是另外一種實現singleton模式的代碼,代碼更簡單,不夠有缺陷,請看

            1 public class singletonss
            2  {
            3      public static readonly singletonss Instance = new singletonss();
            4      private singletonss() { }
            5  }

                  首先定義一個靜態的只讀實例,當然也需要私有構造器繞過缺省構造器,這樣子也可以保證多線程里也只誕生一個對象實例,因為.Net類型初始化機制保證只有一個線程執行了靜態構造器。當然這么少的代碼也可以實現singleton,但是靜態構造器不支持參數,也不能重構,因為在.Net機制里面只允許一個類擁有一個靜態構造器而且是私有的,外部不能調用只能供系統調用,所以我們不能使用參數。

            本文轉自:http://www.cnblogs.com/magicchaiy/archive/2010/12/02/1894826.html
            其他鏈接:http://m.shnenglu.com/dyj057/archive/2005/09/20/346.html

            posted on 2012-07-13 08:14 王海光 閱讀(461) 評論(0)  編輯 收藏 引用 所屬分類: Design Pattern
            久久人人爽人人爽人人片AV东京热| 久久亚洲精品视频| 性做久久久久久免费观看| 亚洲欧美日韩中文久久| 久久亚洲欧美日本精品| 91精品国产91热久久久久福利| 亚洲精品乱码久久久久久按摩| 亚洲中文字幕无码久久2020| 婷婷久久综合九色综合九七| 久久久久人妻一区二区三区vr | 狠狠色丁香久久婷婷综合图片| 久久精品黄AA片一区二区三区| 国产精品国色综合久久| 久久久黄色大片| 久久久久亚洲爆乳少妇无| 亚洲精品乱码久久久久久中文字幕 | 97久久精品午夜一区二区| 午夜精品久久久久久久久| 看全色黄大色大片免费久久久| 国产婷婷成人久久Av免费高清| 99久久综合国产精品免费| 99久久精品免费看国产一区二区三区| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 亚洲欧美日韩精品久久亚洲区| 久久久久久久综合综合狠狠| 精品无码久久久久久久动漫| 国产—久久香蕉国产线看观看| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区| 一本色道久久88综合日韩精品| 国产精品九九久久免费视频 | 日韩va亚洲va欧美va久久| 久久久综合九色合综国产| 久久狠狠高潮亚洲精品| 色婷婷久久综合中文久久蜜桃av | 色8激情欧美成人久久综合电| 国产福利电影一区二区三区久久久久成人精品综合 | 精品国产热久久久福利| 国产精品免费看久久久香蕉| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 狠狠色婷婷综合天天久久丁香 | 久久精品天天中文字幕人妻|