(C#)类成员初始化线程安全问题

时间:2016-03-25 05:18:34

标签: c# static thread-safety

比较两种阶级属性捍卫方式(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]线程安全吗?

1 个答案:

答案 0 :(得分:0)

是的,这两个创建都是线程安全的。不同之处在于实现BSyncRoot对象是在创建Cache实例时创建的。在A中,SyncRoot会在访问时创建。