@Tejs,
实际上,在 .NET 中,您不需要使用双重检查锁定机制 - 有更好的解决方法。但是如果你选择这样做,你的双重检查锁的实现是不正确的并且不是真正的线程安全的。编译器可以优化初始化_instance = new PrintStringDataBuilder();
- 有 3 种可能的修改可以使您的示例真正线程安全:
- 内联初始化静态成员 - 绝对是最简单的!
private static PrintStringDataBuilder _instance = new PrintStringDataBuilder;
public static PrintStringDataBuilder GetInstance()
{
return _instance;
}
2. 使用 'volatile' 关键字来确保 JIT 的初始化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;
}
希望这可以帮助。