[C#] Singleton in C# -03 (lock)

摘要:[C#] Singleton in C# -03 (lock)

public class Singleton
{
    
private static Singleton instance = null;
    
//private static readonly object syncRoot = new object();

    
private Singleton()
    {
    }

    
public static Singleton GetInstance()
    {
        
if (instance == null)
        {
            lock (instance)
//instance能替换syncRoot吗?
            {
                
if (instance == null)
                {
                    instance 
= new Singleton();
                }
            }
        }
        return instance;
    }
}

 

答案是不行的

程式執行到lock的時候,會引發ArgumentNullException異常,“值不能為null”。為什麼lock一個指向null的引用實例不可以呢?

中文MSDN:

lock 確保當一個執行緒位於程式碼的臨界區時,另一個執行緒不進入臨界區。如果其他執行緒試圖進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放

 

某一物件可以指向null引用,但是null關鍵字是不需要釋放的吧?!

 

文章轉自:http://tech.it168.com/a2010/0919/1105/000001105709.shtml

 

 

所以getInstance的完整用法為:

public class Singleton
{
    
private static Singleton instance = null;
    
private static readonly object syncRoot = new object();

    
private Singleton()
    {
    }

    
public static Singleton GetInstance()
    {
        
if (instance == null)
        {
            lock (syncRoot)
            {
                
if (instance == null)
                {
                    instance 
= new Singleton();
                }
            }
        }
        return instance;
    }
}

 

當其它的類別物件要取得實體時,則

protected static frmMain mainForm;

public sampleCalss()

{

mainForm = frmMain.getInstance;

}

以上