是的,这两个创建都是线程安全的。不同之处在于实现
比较两种类别属性防御方法(A&B):
// 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) {
....
}
问题:
由于"Cache"将用作静态实例,因此[A]&[B] 线程安全?
B
,SyncRoot
对象是在创建Cache
实例时创建的。在A
中,SyncRoot
是在访问时创建的。