2015年2月20日 星期五

Lock v.s. Singleton & lazy initialization(evaluation)

雖然在看到MSDN的reference前有想過可能要這樣寫,但我一度以為編譯器最佳化會幫你作掉......
錯誤寫法:
public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         lock (syncRoot) 
         {
            if (instance == null) 
               instance = new Singleton();
         }

         return instance;
      }
   }
}
正確寫法:
public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
   }
}
Comment:
其實兩個寫法應該都是正確的,只是會有速度上的差別。
Reference:
https://msdn.microsoft.com/en-us/library/ff650316.aspx

沒有留言:

張貼留言