asp.net—單例模式

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 }
View Code

其實本人語言組織能力差,不太擅長寫詳細解析。不過既然有園友提議說多寫寫解析,那就在下獻醜了。性能

單例模式的懶漢模式爲何用到兩個判斷一個鎖?優化

這就須要根據代碼一層一層來分析了(這些都是我的看法,不對的地方請諒解):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、爲何用單例模式?線程

對於系統中的某些類來講,只有一個實例很重要,例如,一個系統中能夠存在多個打印任務,可是隻能有一個正在工做的任務;一個系統只能有一個窗口管理器或文件系統;
一個系統只能有一個計時工具或ID(序號)生成器。如在Windows中就只能打開一個任務管理器。若是不使用機制對窗口對象進行惟一化,將彈出多個窗口,若是這些窗口顯示的內容徹底一致,則是重複對象,浪費內存資源;
若是這些窗口顯示的內容不一致,則意味着在某一瞬間系統有多個狀態,與實際不符,也會給用戶帶來誤解,不知道哪個纔是真實的狀態。所以有時確保系統中某個對象的惟一性即一個類只能有一個實例很是重要。  
如何保證一個類只有一個實例而且這個實例易於被訪問呢?定義一個全局變量能夠確保對象隨時均可以被訪問,但不能防止咱們實例化多個對象。一個更好的解決辦法是讓類自身負責保存它的惟一實例。
這個類能夠保證沒有其餘實例被建立,而且它能夠提供一個訪問該實例的方法。這就是單例模式的模式動機。

4、使用場景日誌

  1. Web應用的配置對象的讀取,通常也應用單例模式,這個是因爲配置文件是共享的資源。
  2. 應用程序的日誌應用,通常都何用單例模式實現,這通常是因爲共享的日誌文件一直處於打開狀態,由於只能有一個實例去操做,不然內容很差追加
相關文章
相關標籤/搜索