這不是一個簡單而且安全(因此更好)的方式來實現一個單例,而不是做雙重檢查的鎖定曼波 - 曼波嗎?這種方法的任何缺點?Simpleton的簡單實現
public class Singleton
{
private static Singleton _instance;
private Singleton() { Console.WriteLine("Instance created"); }
public static Singleton Instance
{
get
{
if (_instance == null)
{
Interlocked.CompareExchange(ref _instance, new Singleton(), null);
}
return _instance;
}
}
public void DoStuff() { }
}
編輯:測試線程安全的失敗,任何人都可以解釋,爲什麼? Interlocked.CompareExchange怎麼不是真正的原子?
public class Program
{
static void Main(string[] args)
{
Parallel.For(0, 1000000, delegate(int i) { Singleton.Instance.DoStuff(); });
}
}
Result (4 cores, 4 logical processors)
Instance created
Instance created
Instance created
Instance created
Instance created
難道這個例子仍然會造成一個問題,如果兩個線程都能夠得到'如果(_instance == NULL)內'檢查他們之一執行'Interlocked.CompareExchange'功能? – Tim 2011-05-13 19:23:26
這是不正確的。根據MSDN文檔:「比較和交換操作是作爲原子操作執行的。」 – kateroh 2011-05-13 19:33:48
@ kateroh - 啊,我明白了,我在同一時間將它作爲一個比較和交換。所以它是一個雙重檢查。我的錯。 – Tim 2011-05-13 19:39:41