慢慢的做記錄,做最強大的自己 看了大話設計模式之後感觸很深,發現自己還有很多學習的東西,設計軟體並不是一兩句代碼把功能寫完了就行,需要思考的內容有很多 代碼來源參考大話設計模式這本書,這裡在博客里記錄一下,不可能每次都去翻書,但是在博客裡面是非常好找的。 單例模式應用場景很多,比如我設置定時器,進行 ...
慢慢的做記錄,做最強大的自己
看了大話設計模式之後感觸很深,發現自己還有很多學習的東西,設計軟體並不是一兩句代碼把功能寫完了就行,需要思考的內容有很多
代碼來源參考大話設計模式這本書,這裡在博客里記錄一下,不可能每次都去翻書,但是在博客裡面是非常好找的。
單例模式應用場景很多,比如我設置定時器,進行多線程任務管控,多線程的處理在我工作中編寫代碼的時候還是經常會用到的;或者我的軟體中存在多個任務,但只能有
其中一個在運行;
單例模式:保證一個類裡面只有一個實例,並提供一個訪問他的全局訪問點。
這個過程具體是怎麼樣的,就看一下下麵的例子,比如我有一個任務類,我不想其他訪問者不斷的去new這個任務類,那麼我就先私有化,私有化完畢後,再創建一個全局
訪問點
private static Task Programx; //定義了一個任務編程x private Task() //先私有化,堵死外界利用new創建這個實例的可能 { } public static Task GetTask() //利用GetTask方法獲得唯一的一個全局訪問點 { if (Programx == null) //如果任務不存在,就new一個,存在就返回已有的 { Programx = new Task(); } return Programx; }
在使用者進行調用時,就不需要不斷的去new這個任務類了,理解起來還是很簡單的
static void Main(string[] args) { Task T1 = Task.GetTask(); Task T2 = Task.GetTask(); if (T1 == T2) { Console.WriteLine("存在兩個相同的任務"); } Console.ReadLine(); }
多線程裡面處理又是怎麼樣的呢,我們知道,多線程處理時可以通過用鎖(lock)來阻止線程訪問,lock確保當一個線程位於臨界區時,另一個線程不進入臨界區。如果其他線程試圖進入已經被我鎖定的代碼裡面,那麼它就會被阻止,除非我釋放了當前對象。
下麵這段代碼中展示了對象實例由最先進入的那個線程創建,以後線上程再進入的時候就不會去創建對象實例了,也保證了多線程的環境下的同時訪問也不會造成多個實例的生成
class SingleTon { private static SingleTon instance; private static readonly object syncRoot = new object(); private SingleTon() { } private static SingleTon GetInstance() { lock (syncRoot) //在同一時刻只有加鎖的才能進去 { if (instance == null) { instance = new SingleTon(); } } return instance; } }
現在我們看一下雙重鎖定,上面的例子裡面每次都要給線程加鎖,雙重鎖定則只在實例未被創建的時候進行加鎖處理,同時也能保證多線程的安全
class SingleTon { private static SingleTon instance; private static readonly object syncRoot = new object(); private SingleTon() { } private static SingleTon GetInstance() { if(instance == null) //先判斷實例是否存在,不存在再加鎖處理 { lock (syncRoot) { if (instance == null) //雙重鎖定 { instance = new SingleTon(); } } } return instance; } }
其實單例模式也很簡單,歸納一下其實就是去判斷實例是否存在,存在的話就直接返回,不存在就new一個實例,使用的人就可以嚴格的控制這個類不斷的被new了