这是避免双重检查锁的有效且优化的方法吗:
public class SomeBaseClass
{
protected static object InitializeLock = new object();
protected static bool IsInitialized = false;
public void SomeFunction()
{
if (!IsInitialized)
{
System.Threading.Thread.MemoryBarrier();
lock (InitializeLock)
{
// do init stuff
IsInitialized = true;
}
}
//Do stuff that have to happen when function is called
}
}
这是经过双重检查的替代方案:
public class SomeBaseClass
{
protected static object InitializeLock = new object();
protected static bool IsInitialized = false;
public void SomeFunction()
{
if (!IsInitialized)
{
lock (InitializeLock)
{
if (!IsInitialized)
{
// do init stuff
IsInitialized = true;
}
}
}
//Do stuff that have to happen when function is called
}
}
最佳答案
不,因为线程切换可以在两个线程通过 if (!IsInitialized)
有一篇很棒的文章在创建单例的上下文中解释了这个主题:http://csharpindepth.com/Articles/General/Singleton.aspx (乔恩·斯基特)
关于c# - (无效的方法)避免在 C# 中双重检查锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5821920/