比较两种阶级属性捍卫方式(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]和“A”中的“SyncRoot”创建都是[B]线程安全吗?
答案 0 :(得分:0)
是的,这两个创建都是线程安全的。不同之处在于实现B
,SyncRoot
对象是在创建Cache
实例时创建的。在A
中,SyncRoot
会在访问时创建。