@ 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;
}
お役に立てれば。