c# - (无效的方法)避免在 C# 中双重检查锁

标签 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
    }
}

这是经过双重检查的替代方案:

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/

相关文章:

c# - Entity Framework 无法识别的唯一键

c# - 在多点触摸屏上捕获双击触摸

c# - "Member access ' DataType MemberName ' of ' Namespace.ClassName ' not legal on type ' System.Collections.Generic.IEnumerable `1[Namespace.ClassName]."

windows - 用户级线程内核级线程和纤程

我们可以获得信号量或条件变量的文件描述符吗?

c# - 如何声明这个嵌套数组/列表?

c# - 了解没有线程的异步/等待

c - pthread_mutex_t 位于结构体内部并在访问时锁定该结构体

locking - 对 DBMS 锁定的说明

c# - 对象当前正在别处使用