NO IMAGE
/// <summary>
/// 適用於在多執行緒的情況下保證只有一個例項化物件的情況
/// </summary>
// 雙重鎖定單例
public sealed class Singleton
{
// 定義一個類物件,用於內部實現
private static Singleton myInstance;
//const和readonly有什麼區別?
//const關鍵字用來宣告編譯時的常量
//readonly用來宣告執行時的常量
// 變數標記為 readonly,第一次引用類的成員時建立例項
private static readonly object lockRoot = new object ();
// 設定構造方法為私有,這樣就不能在外部例項化類物件了
private Singleton ()
{
}
// 例項化物件的方法
public static Singleton GetInstance ()
{
// 這裡面使用兩個判斷是否為null的原因是,我們不需要每次都對例項化的語句進行加鎖,只有當物件不存在的時候加鎖就可以了
if (myInstance == null) {
// 鎖定的作用就是為了保證當多執行緒同時執行這句程式碼的時候保證物件的唯一性
// 鎖定會讓同時執行這段程式碼的執行緒排隊執行
// lock裡面需要用一個已經存在的物件來判斷,所以不能使用myInstance
lock (lockRoot) {
// 這裡還需要一個判斷的原因是,如果多執行緒都通過了外層的判斷進行排隊
// 那將會例項化多個物件出來,所以這裡還需要進行一次判斷,保證執行緒的安全
if (myInstance == null) {
myInstance = new Singleton ();
}
}
}
return myInstance;
}
}