C#單例模式

 

public class SingLeton多線程

{函數

     private static SinglLeton singleton=null; 優化

      private SingLeton()線程

     {資源

     }get

    public static SingLeton getsingleton()同步

   { 博客

        if(singleton==null)class

       {object

           SingLeton singleton=new  SingLeton();

       }

       return singleton;

   }

}

上面的代碼就是一個單例模式的類,在使用單例模式時須要注意如下幾點:

1.單例模式(Singleton)的構造函數必須是私有的(private),以保證程序中不能使用new()來實例,達到整個程序中只有惟一一個實例的目的;

2.必須提供一個靜態的全局函數訪問點,以確保外部能訪問該實例;

     上面的單例模式(Singleton)中,在只有單線程去執行時是正確的,但若是在使用多線程時就會出現有多個實例,顯然違背了單例模式(Singleton)的條件;哪麼在多線程中咱們應該怎樣去實現單例模式(Singleton)呢???

     下面咱們就來看看多線程中單例模式(Singleton)的實現:

      在多線程中不能使用上面代碼中的單例模式(Singleton)的緣由是由於它違反了整個程序中只有惟一一個實例的條件,因此咱們要想在多線程中使用單例模式(Singleton)就必須實現只有惟一一個實例這一條件;在多線程中由於每條線程都是獨立訪問的,因此纔會出多個實例;哪麼只要咱們在if條件前加上鎖(lock)就能避免出現多個實例;下面咱們來看看代碼的實現:

public class SingLeton

{

     private static SinglLeton singleton=null; 

     private static readonly object lockS=new object();//確保線程同步

      private SingLeton()

     {

     }

    public static SingLeton getsingleton()

   { 

        lock(lockS)

       {

           if(singleton==null)

           {

                SingLeton singleton=new  SingLeton();

           }

      }

       return singleton;

   }

}

    以上的代碼就是單例模式(Singleton)在多線程中的實現;

    在上面的多線程中的單例模式中是不是最好的呢?是否是使用最少資源呢?還能不能優化類呢?

下面咱們就先來分析多線程中單例模式(Singleton)的運行:

    當程序的線程跑到鎖(lock)的時候就會停下來判斷是否有線程在用鎖(lock)裏面的代碼,沒有就纔會進入,哪麼若是多條線程跑到鎖(lock)的時候就只能一條一條進入鎖(lock)(固然這原本就是多線程鎖(lock)的功能);進入鎖裏面判斷到已有實例就跳出if不進行實例化。

上面咱們對多線程中的單例模式(Singleton)作了分析;在上面的分析中咱們能夠看出,每條線程都要先進入鎖(lock)才作了判斷;但在沒進入鎖以前線程就知道已經能夠判斷出是否有過實例,哪爲何咱們不在外面進行判斷一次後在進入鎖(lock)呢?好!既然這樣咱們把代碼改改看看效果,咱們在鎖(lock)的外面加多一次判斷

public class SingLeton

{

     private static SinglLeton singleton=null; 

     private static raedonly object lockS=new object();//確保線程同步

      private SingLeton()

     {

     }

    public static SingLeton getsingleton()

   { 

     if(singleton==null)

        lock(lockS)

       {

           if(singleton==null)

           {

                SingLeton singleton=new  SingLeton();

           }

      }

    }

       return singleton;

   }

}

從更改後的代碼上看來,有人會問爲何要用兩次if呢?有必要嗎?外面不都判斷過了嗎?能夠去掉一個if條件判斷啊,這樣代碼不是更加少嗎?

下面我就來解釋下爲何要用到兩次if。

其實用兩個if的緣由仍是在於多線程的特性,仍是由於多線程訪問函數時都是獨立訪問的,因此纔要用到兩個if(說到這裏你們都應該明白了,因此就不說下去了(不明白的能夠在去了解多線程的物性))。

 

 

這是第一次寫博客、文采也很差,有什麼不對的寫的很差的請你們見涼。。。。。。

相關文章
相關標籤/搜索