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



比较两种类别属性防御方法(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] 线程安全?

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

最新更新