多線程併發下的單例模式

多線程併發下的單例模


好久沒寫點東西了,感覺很對不住各位。今天有點心得正好和大家聊聊閒天。是關於單例模式在併發情況下應該怎麼寫纔對,我還是用.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;
       }
   }
這樣就可以實現有且僅有一次初始化的機會。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章