單例模式 代碼: 第一種: 第二種: 上面兩種單例模式中,基本思路相同,將構造方法私有,建立私有的實例對象,提供公有的對象。第一種方法,外部每次調用時都會判斷實例是否已經創建,第二種方法則是在一開始就將類的對象實例化好了,一直存在在記憶體中。區別也不大,單例的思想也就這麼簡單。這裡要說的是下麵這種方法 ...
單例模式
代碼:
第一種:
private static Singleton singleton = null; private Singleton() { } public static Singleton GetInstance { get { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
第二種:
public class Singleton { private static readonly Singleton singleton = new Singleton(); private Singleton() { } public static Singleton GetInstance { get { return singleton; } } }
上面兩種單例模式中,基本思路相同,將構造方法私有,建立私有的實例對象,提供公有的對象。第一種方法,外部每次調用時都會判斷實例是否已經創建,第二種方法則是在一開始就將類的對象實例化好了,一直存在在記憶體中。區別也不大,單例的思想也就這麼簡單。這裡要說的是下麵這種方法。
public class Singleton { private static Singleton singleton = null; private static object flagobj = new object(); private Singleton() { } public static Singleton GetInstance { get { if (singleton == null) { lock (flagobj) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } } }
這種實現方式和上面最多了一個object對象,然後看看GetInstance里有什麼變化,思路很簡單,多出來的object對象就是一個鎖,其他地方訪問的時候首先判斷這個類是否有實例,沒有實例就把"鎖"給鎖上,為什麼要鎖上呢?鎖是為了怕"別人"使用,也就是應對多線程的情況了。然後我們再來看看為什麼判斷了兩次當前實例引用是否為空呢?假設有兩個線程a、b同時來到GetInstance,此時的singleton為null,那麼都進去了,a把flagobj鎖上,b就在外面等了,然後a再判斷singleton是不是空引用,創建了一個實例,a走了之後b進來發現已經不是null了,就不再創建了,所以lock內的if是一定要存在的,那這時來看看為什麼外面還要一個if呢?直接裡面判斷不是就好了嘛?這就是lock本身的問題了,要知道lock本身是一個相對耗時的操作,所以在外面加一個if,來規避過多的lock操作。三種方法,實習到目前為止,之前做的都是web的,那些很少用到多線程 ,唯一一次還是為了展示一下自己是會的才用的(然後我老大看到的時候並沒有誇我。。),所以我大部分情況都還是用以上兩種單例模式。