多线程并发下的单例模


好久没写点东西了,感觉很对不住各位。今天有点心得正好和大家聊聊闲天。是关于单例模式在并发情况下应该怎么写才对,我还是用.net语言来说这些。
首先,我们都知道单例模式,别说你不知道。
代码如下:
public class Singleton
   {
       private Singleton() { }
       private static Singleton instance = null;
       public Singleton GetInstance()
       { return instance == null ? new Singleton() : instance; }
   }
但是这个有问题了,多线程下,怎么能保证从instance == null?到new Singleton() : instance之间没有别的线程在操作呢?现在的代码明显满足不了这个情况,而这在高并发下显然是可以出现的。那就想想办法呗,例如我们使用.net中的lock来做修改。
public class Singleton
   {
       private Singleton() { }
       private static Singleton instance = null;
       private static object _lock = new object();
       public Singleton GetInstance()
       {
           if (instance == null)
           {
               lock (_lock)
               {
                   if (instance == null)
                   { instance = new Singleton(); }
               }
           }
           return instance;
       }
   }
这样就可以实现有且仅有一次初始化的机会。