設計模式之單例模式學習(C#)

來源:互聯網
上載者:User

標籤:換工作   on()   簡介   color   src   機制   exp   解鎖   singleton   

          最近在換工作,發現面試都會問到設計模式中的單例模式,所以回家做了一個對於單例模式的總結,如有問題,請留言指教。

 

單例模式的簡介

單例模式:就是保證系統中只有一個執行個體,就叫單例模式(singleton pattern);

單例模式分為:餓漢式和懶漢式;

單例模式必須遵循的規則:

1. 該類,在整個系統中必須只能有一個執行個體;

2. 這個唯一的執行個體,必須類自行建立這個執行個體;

3. 必須自行向整個系統提供這個執行個體;

單例模式具體實現必須遵循的規則:

1. 定義一個靜態變數來儲存執行個體;

2. 定義一個私人的建構函式,阻止外界自己建立執行個體;

3. 定義一個靜態公有方法,提供一個全域的訪問點;

4. 考慮到安全執行緒時,需要定義一個標識,確保線程同步機制;

單例模式的典型的應用代碼:

餓漢式

餓漢式,不用考慮在使用者給執行個體賦值null時,出問題.因為每次進去都會執行個體化;

  public class  Singleton {   private static Sinleton mySingleton=new Sinleton();   private Sinleton{}   public static Sinleton GetIntance(){return mySinleton;}}
View Code

懶漢式

public class Singleton{  private static Singleton mySingleton;  private Singleton{}  public static Singleton GetIntance(){   if(mySingleton==null){    return mySingleton=new Singleton();}return mySingleton;}}
View Code

單例模式多線程情況

針對懶漢式,多線程下出現這種情況:比如兩線程A和B,A運行到if(mySingleton==null) 時,B運行到mySingleton=new Singleton();B雖然執行個體化了mySingleton,但是對於A還是沒有被執行個體化,A繼續會執行 mySingleton=new Singleton();這個時候就出現問題了 ,有兩個執行個體的問題;於是改編代碼

public class SingletonExample{ private static SingletonExample mySingleton;private static readonly object  locker=new object();private SingletonExample{}//該公有存取方法,可以重載多參數的方法;public static SingletonExample GetInstance(){if(mySingleton==null){lock(locker){ mySingleton=new SingletonExample();}}return mySingleton;}}
View Code

 

此時,A,B同時運行到lock(locker) ,這時只能一個線程訪問,於是B先執行,B獲得鎖,然後B執行完後,解鎖. A執行去,因為沒有判斷是否mySingleton==null,所以還是會執行個體化,出現兩個執行個體的情況;

於是雙重檢查模式(DCL)就出現了。代碼如下:

public class SingletonExample{
//此處是懶漢式; 未執行個體化 ,比較常用.
//餓漢式: private static SingletonExample mySingleton =new SingletonExample(); //已執行個體化
private static SingletonExample mySingleton;private static readonly object locker=new object();private SingletonExample(){}
//該公有存取方法,可以重載多參數的方法;
public static SingletonExample GetInstance(){if(mySingleton==null){lock(locker){if(mySingleton==null){ mySingleton=new SingletonExample();}}}return mySingleton;}}

 

 

注意:

1.因為實現單例模式的這個實際是一個類,所以除了遵循了單例該有的規則,其他的欄位,屬性都和普通類一樣都可以存在;

 

 

關於單例模式的基礎學習就是以上,有問題,請留言互相討論;THX

 

設計模式之單例模式學習(C#)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.