單例模式學習總結

1. 參考資料

  1. 單例模式-伯樂在線

2. 知識點理解

  1. 定義:系統運行中有且僅有一個實例
  2. 示例代碼:
    public class Singleton {  
        private Singleton() {}                     //關鍵點0:構造函數是私有的
        private static Singleton single = null;    //關鍵點1:聲明單例對象是靜態的
        private static object obj= new object();
        public static Singleton GetInstance()      //經過靜態方法來構造對象
        {                        
             if (single == null)                   //關鍵點2:判斷單例對象是否已經被構造
             {                             
                lock(obj)                          //關鍵點3:加線程鎖
                {
                   if(single == null)              //關鍵點4:二次判斷單例是否已經被構造
                   {
                      single = new Singleton();  
                    }
                 }
             }    
            return single;  
        }  
    }
  3. 注意點
    • 構造函數必須爲private
    • 單例對象必須聲明爲靜態:外部靜態調用
    • 構造單例對象以前要加鎖(lock一個靜態的object對象)
    • 須要兩次檢測單例實例是否已經被構造,分別在鎖以前和鎖以後 Double Check lock
    • 枚舉類 Instance 實現單例,InstanceEnum.Instance調用
  4. 關鍵問題
    1. 爲什麼要檢測兩次?有可能延遲加載或者緩存緣由,形成構造多個實例,違反了單例的初衷。
    2. 構造函數可否公有化?不行,單例類的構造函數必須私有化,單例類不能被實例化,單例實例只能靜態調用
    3. lock住的對象爲何要是object對象,能夠是int嗎?不行,鎖住的必須是個引用類型。若是鎖值類型,每一個不一樣的線程在聲明的時候值類型變量的地址都不同,那麼上個線程鎖住的東西下個線程進來會認爲根本沒鎖,至關於每次都鎖了不一樣的門,沒有任何卵用。而引用類型的變量地址是相同的,每一個線程進來判斷鎖多想是否被鎖的時候都是判斷同一個地址,至關因而鎖在通一扇門,起到了鎖的做用。
相關文章
相關標籤/搜索