單例模式和多線程有沒有關系?


單例模式解決的問題:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點

 
 
多線程時雙重鎖定的單例模式:
  1. class Singletion
  2.     {
  3.         private static Singletion instance;
  4.         private static readonly object syncRoot = new object();
  5.         private Singletion() { }
  6.         public static Singletion GetInstan()
  7.         {
  8.             if (instance == null)
  9.             {
  10.                 lock (syncRoot)
  11.                 {
  12.                     if (instance == null)
  13.                     {
  14.                         instance = new Singletion();
  15.                     }
  16.                 }
  17.             }
  18.             return instance;
  19.         }
  20.     }
為什么有兩處if(instance==null)?   --當為null時並且同時有2個線程調用GetInstan()時,它們將都可以通過第一重的判斷,然后由於lock機制,一個線程進入排隊,當第一個線程出來后如果沒有第二層判斷將重新創建
 
 
靜態化下多線程時的單利模式:
    /// <summary>
    /// sealed修飾符可以應用於類、實例方法和屬性。密封類不能被繼承
    /// </summary>
  1.     public sealed class Singletion
  2.     {
  3.         private static readonly Singletion instance = new Singletion();
  4.         private Singletion() { }
  5.         public static Singletion GetInstan()
  6.         {
  7.             return instance;
  8.         }
  9.     }
 這樣寫依賴於公共語言運行庫來初始化變量,由於構造函數是私有的所以不能在類本身以外實例化Singletion類;因此變量的引用的是可以在系統中存在的唯一實例。這種方式是在自己被加載時就將自己實例化,所以被稱為餓漢式單利模式;原先的要在第一次被引用時才會將自己實例化被稱為懶漢示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM