@Tejs,
其實,在.NET你不需要使用雙檢鎖機構 - 周圍有更好的方式。但是如果你選擇這樣做,那麼你的雙重檢查鎖的實現是不正確的,並且不是真正的線程安全的。編譯器可以優化掉_instance = new PrintStringDataBuilder();
的初始化 - 有3次可能的修改,讓您真正例如線程安全:
- 初始化靜態成員在線 - 絕對最簡單的!
private static PrintStringDataBuilder _instance = new PrintStringDataBuilder;
public static PrintStringDataBuilder GetInstance()
{
return _instance;
}
2。使用'volatile'關鍵字來確保PrintStringDataBuilder
的初始化沒有被JIT優化。
private static volatile PrintStringDataBuilder _instance = null;
private static object _lockObject = new object();
public static PrintStringDataBuilder GetInstance()
{
if(_instance == null)
{
lock(_lockObject)
{
if(_instance == null)
{
_instance = new PrintStringDataBuilder();
}
}
}
return _instance;
}
3。使用Interlocked.Exchange與雙重檢查鎖:
private static PrintStringDataBuilder _instance = null;
private static object _lockObject = new object();
public static PrintStringDataBuilder GetInstance()
{
if(_instance == null)
{
lock(_lockObject)
{
if(_instance == null)
{
var temp = new PrintStringDataBuilder();
Interlocked.Exchange(ref _instance, temp);
}
}
}
return _instance;
}
希望這會有所幫助。
這真的取決於'新的PrintStringDataBuilder()'的作用。你想讓它變成單身?如果是這樣,那不是這樣做的。如果不是,那麼爲什麼只要調用構造函數就可以有一個靜態的'GetInstance()'方法。 – cadrell0 2012-04-27 17:49:55
你有一個私人構造函數'PrintStringDataBuilder'你是如何初始化其他字段? – 2012-04-27 17:50:41
爲什麼選擇倒票?我認爲這是個好問題 – n8wrl 2012-04-27 17:52:16