Cas*_*sen 3 c# multithreading locking
这是避免双重检查锁的有效且优化的方法:
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
}
}
Run Code Online (Sandbox Code Playgroud)
这是双重检查的选择:
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
}
}
Run Code Online (Sandbox Code Playgroud)
不,因为线程切换可以在两个线程通过后立即发生 if (!IsInitialized)
有一篇很棒的文章,在创建单例的背景下解释了这个主题:http://csharpindepth.com/Articles/General/Singleton.aspx(作者Jon Skeet)
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |