1、單例模式是什麼?多線程
定義:確保一個類僅僅能產生一個實例,而且提供一個全局訪問點來獲取該實例。ide
2、單例模式怎麼用? 工具
1 class SingleCase 2 { 3 public string Name{get;set;} 4 public static SingleCase mySingle = null; 5 public static object Flag = new object(); 6 7 public static SingleCase getInstance(string name) 8 { 9 //判斷是否實例化過 10 if(mySingle == null) 11 { 12 //進入lock 13 lock(Flag) 14 { 15 //判斷是否實例化過 16 if(mySingle == null) 17 { 18 mySingle = new SingleCase(); 19 mySingle.Name = name 20 } 21 } 22 } 23 return mySingle; 24 } 25 }
其實本人語言組織能力差,不太擅長寫詳細解析。不過既然有園友提議說多寫寫解析,那就在下獻醜了。性能
單例模式的懶漢模式爲何用到兩個判斷一個鎖?優化
這就須要根據代碼一層一層來分析了(這些都是我的看法,不對的地方請諒解):spa
//其實若是隻針對單線程而言,使用一個判斷就能夠 if(mySingle == null) { mySingle = new SingleCase(); mySingle.Name = name } //可是遇到多線程時候上面的代碼就不能確保只產生一個實例了(這裏多線程的概念就不作介紹了) //因此這時候爲了可以確保只產生一個實例,這裏就使用了lock使線程同步(即同個時間段只容許一個線程執行) lock(Flag) { //判斷是否實例化過 if(mySingle == null) { mySingle = new SingleCase(); mySingle.Name = name } } //通過上述代碼應該就能夠確保不管是單線程仍是多線程都只能產生一個實例了, //那爲何在lock外面還須要再加一個判斷呢? //這裏有個多線程性能問題:由於lock的功能是使一個線程(A)經過,而讓其餘線程進入等待(A)線程執行完再執行。 //那麼如何優化呢? //只要有一個線程產生了一個實例,那後續其餘線程再也不須要進入lock //因此這就是lock外面還須要再加一個判斷的緣由 //判斷是否實例化過 if(mySingle == null) { //進入lock lock(Flag) { //判斷是否實例化過 if(mySingle == null) { mySingle = new SingleCase(); mySingle.Name = name } } }
3、爲何用單例模式?線程
4、使用場景日誌