Monday, December 10, 2012

Design Patterns-Singleton Pattern& Thread

Singleton Patterns

保證一個類別僅有一個Instance,並提供一個全域訪問點。

1.該物件自行決定是否被Instance,而不是靠其他物件初始化。(將該物件的Constructor需告成Private)。

2.因建構子私有化,所以產生一個Method為公有化(物件為Publuc 、Static)。

 

Multithread in Singleton Pattern

給行程一把鎖。(lock)

   1: class Singleton
   2: {
   3:     private static Singleton instance;
   4:     private static readonly object syncRoot = new object();
   5:     private Singleton(){}
   6:     public static Singleton GetInstance()
   7:     {
   8:         lock(syncRoot)
   9:         {
  10:             if(instance == null)
  11:             {
  12:                 instance = new Singleton();
  13:             }
  14:         }
  15:         return instance;
  16:     }
  17: }

但每當使用GetInstance時,都要lock因此可以再給予改良:



   1: class Singleton
   2: {
   3:     private static Singleton instance;
   4:     private static readonly object syncRoot = new object();
   5:     private Singleton(){}
   6:     private static Singleton GetInstance()
   7:     {
   8:         if(instance == null)
   9:         {
  10:             lock(syncRoot)
  11:             {
  12:                 if(instance == null)
  13:                 {
  14:                     instance = new Singleton();
  15:                 }
  16:             }
  17:         }
  18:         return instance;
  19:     }
  20: }

只在實體未被建立的時候加鎖處理,同時保證多執行續的安全。Double-Check Locking


第8、12都有 instance==null,這是因為當兩個Thread調用GetInstance()方法時,透過第一層instance ==null的判斷後,lock只會讓其中一個Thread進入,另一個還在外面排隊。若沒有第二層instance ==null 則第一個Thread建立實體後,第二個Thread還可以繼續建立實體,而沒有達到Singleton 目的。


同是要記的阻止Singleton被繼承,因為繼承後可能會增加實體。



   1: public sealed class Singleton{}

No comments:

Post a Comment