2010-10-29 51 views
1

我知道有很多方法可以實現諸如(雙重檢查鎖定模式,靜態只讀方法,鎖定法)一個線程安全的Singleton模式,但我只是想下面的代碼Singleton實例

static void Main(string[] args) 
{   
    for (int i = 0; i <= 100; i++) 
    { 
     Thread t = new Thread(new ParameterizedThreadStart(doSome)); 
     t.Start(null);    
    } 
    Console.ReadLine(); 
} 

private static void doSome(object obj) 
{   
    MyReadOnly obj1 = MyReadOnly.getInstance; 
    Console.WriteLine(obj1.GetHashCode().ToString()); 
} 

class MyReadOnly 
{ 
    private static MyReadOnly instance = new MyReadOnly(); 
    int counter = 0; 

    // static MyReadOnly() 
    // { 
    // } treat is as commented code. 

    public static MyReadOnly getInstance { get { return instance; } } 
    private MyReadOnly() 
    { 
     Console.WriteLine((++counter).ToString()); 
    }  
} 

當我看到輸出這個程序,我看到只是單個對象創建(因爲相同的哈希碼)

如何證明此代碼不是線程安全的?

編輯

去除靜態構造函數這會導致一些混亂

+0

你沒有做任何concurent訪問,所以沒有問題 – 2010-10-29 09:22:44

回答

6

由於.NET中類型初始值設定項的性質,該代碼是線程安全的。類型初始化器保證只運行一次,如果兩個線程同時運行它,一個會這樣做,另一個會阻塞。

有關更多詳細信息,請參閱我的article on singleton implementation

+0

謝謝,實際上我已經在下面的網站http://www.yoda.arachsys.com/csharp/singleton.html閱讀了你的artical,但它是實現一個singleton的正確方法還是這可以用作一個模式 – TalentTuner 2010-10-29 09:10:34

+0

@saurabh:你給出的代碼*基本上是頁面上的一種模式。 – 2010-10-29 09:24:07

2

這實際上是線程安全的代碼,因爲你使用靜態構造函數來創建靜態構造函數的實例(和CLR保證調用是(間接)在訪問任何其他類型成員之前/之前是線程安全的方式)。

+0

謝謝youyr回答vinay。 – TalentTuner 2010-10-29 09:11:26

相關問題