單例模式--C#

剛剛看設計模式,還不知道這些設計模式有什麼做用,可是先記錄下來,也許之後會用到!設計模式

單例模式:就是保證一個類只有一個實例的實現方法多線程

 

如,有一個構造函數,使外界不能建立該類的實例函數

private 這個類的類名()
{
  Console.Write("這是單例模式測試\n");
}測試

設置私有,保證它不能被外部實例化,線程

在當前類中創建一個靜態變量用來保存這個類的實例設計

private static 這個類的類名 example;排序

再定義一個標識,後面用來加鎖用到同步

private static readonly object locker = new object();it

這些變量和標識都設置爲私有,已保證不能被外部調用class

 

以後就要創建一個公有的方法實例化這個類,外部經過調用這個公有的方法來獲得這個類的實例

public static 這個類的類名 GetInstance()

1.判斷這個類是否實例化

if(example==null)

2.鎖住locker,是得locker被鎖期間不被執行裏面的方法

lock (locker)

3.再次判斷類是否被實例化

if(example==null)

4.實例化這個類

example= new Singleton();

5.最後輸出這個類的實例

return example;

 

 

獲得完整代碼

public class Singleton
{
  //定義一個靜態變量來保存類的實例
  private static Singleton example;

  //定義一個標識確保線程同步
  private static readonly object locker = new object();

  //定義私有構造函數,使外界不能建立該類的實例
  private Singleton()
  {
    Console.Write("這是單例模式測試\n");
  }

  /// <summary>
  /// 定義公有方法提供一個全局訪問點,同時你也能夠定義公有屬性來提供全局訪問點
  /// </summary>
  /// <returns></returns>
  public static Singleton GetInstance()
  {

    //多線程同時運行到這裏,會同時經過這個判斷條件執行條件內的代碼
    if (example== null)//限制一
    {

      //多線程同時運行到這裏後,只能有一個線程經過lock鎖,其餘線程會被掛起
      lock (locker)//限制二
      {
        // 再次判斷若是類的實例是否建立,若是不存在則實例化,反之就直接輸出類的實例
        if (example== null)限制三
        {
          example= new Singleton();
        }
      }
    }
    return example;
  }
}

 

若是有多個線程同時運行到限制一,會同時經過限制一,這樣的話就會就有多個線程同時運行到限制二,這些線程運行到限制二後,會進行一個小的「排序」,「排序」第一的線程經過限制二後,限制二就會自我封閉,直到「排序」第一的線程跑出限制二的範圍,限制二纔會繼續容許其餘「排序」的線程經過。這樣,到限制三的時候,就只有一個「排序」第一的線程了,排序第一的線程順利經過限制三,實例化類,跑出限制三,限制二。這裏,剛纔在等待的其餘線程就會陸續經過限制二了,可是它們經過限制二也已經晚了,由於這個類已經被實例化過了,因此它們也就沒法通限制三了,而直接輸出被「排序」第一的線程實例化後的類實例,

相關文章
相關標籤/搜索