2016-03-25 11 views
0

クラスのプロパティdefenition(& B)の2つの方法の比較:(C#)クラスメンバー初期化するスレッドの安全性の問題

// implemention A 
public class Cache { 
    private object m_syncRoot = null; 
    public object SyncRoot { 
     get { 
      if (m_syncRoot == null) { 
       Interlocked.CompareExchange(ref m_syncRoot, new object(), null);    
      } 
      return m_syncRoot; 
     } 
    } 
} 

// implemention B. 
public class Cache { 
    public object SyncRoot { get; } = new object(); // in C# 6.0 
} 

を最後にいくつかの場所では、キャッシュを使用しています。

static Cache MyCache = new Cache(); // I don't know if this kind of declaration is thread-safe either 
lock (MyCache.SyncRoot) { 
    .... 
} 

質問:

"キャッシュ"は静的インスタンスとして使用されるため、[A] & [B]の "SyncRoot"の両方の作成はスレッドセーフですか?

答えて

0

はい、両方の作成はスレッドセーフです。差異は実装Bにあり、SyncRootオブジェクトはCacheインスタンスが作成されたときに作成されます。 Aでは、アクセス時にSyncRootが作成されます。