考慮你有以下代碼:
1.爲什麼我們使用雙重鎖定,爲什麼單鎖不夠好,請提供詳細的例子。
2.這個實現的主要缺點是什麼?我該如何證明它?
謝謝。單雙鎖設計模式
public sealed class SomeSingleton5
{
private static SomeSingleton5 s_Instance = null;
private static object s_LockObj = new Object();
private SomeSingleton5() { }
public static SomeSingleton5 Instance
{
get
{
if (s_Instance == null)
{
lock (s_LockObj)
{
if (s_Instance == null)
{
s_Instance = new SomeSingleton5();
}
}
}
return s_Instance;
}
}
}
在.NET中你不必使用這種模式。類型系統保證靜態字段不會受到雙重鎖定模式嘗試避免的爭用條件的影響。在Java中它是不同的。 –
第二個檢查是在's_Instance'初始化之前處理一個競態條件,兩個線程都訪問getter。兩個線程都將's_Instance'評估爲null,所以_both_進入鎖定狀態。人們將進入,初始化's_Instance'並返回。第二個線程將進入,如果你沒有第二個檢查,它會_reinitialize_'s_Instance'並返回一個新的實例。現在這兩個線程將有兩個不同的單例實例。 –
@ChrisSinclair:好的,現在很明顯,但我現在想知道這個解決方案是否可以完全解決任何競爭條件,或者我們剛剛解決了您提到的特定情況。我找不到能夠映射所有可能發生的競爭條件,因此很難理解爲什麼這能夠解決所有競爭條件 – JavaSa