这个Comparer类来自CLI库代码Thread Safe吗?

时间:2011-03-16 23:40:52

标签: .net multithreading thread-safety sscli

public abstract class Comparer<T> : IComparer, IComparer<T>
    {
        static Comparer<T> defaultComparer;    

        public static Comparer<T> Default {
            get {
                Comparer<T> comparer = defaultComparer;
                if (comparer == null) {
                    comparer = CreateComparer();
                    defaultComparer = comparer;
                }
                return comparer;
            }
        }

首先,Default属性线程是否安全? 是否可能出现以下陈述的影响

comparer = CreateComparer(); 
除了创建线程之外的其他线程可能看不到

? 那么,构造了多个Comparer实例吗?

微软这样做是为了交易同步成本和成本 创建多个对象?

为什么首先将defaultComparer首先分配给comparer变量...然后再交换? 为什么Comparer comparer = defaultComparer?

2 个答案:

答案 0 :(得分:1)

是。确实会创建多个比较器,defaultComparer会多次分配。不是问题,它们都是一样的。垃圾收集器负责附加功能。并且CLR为对象引用提供的原子赋值保证了静态不能被错误地读取。

答案 1 :(得分:0)

是的,肯定有可能创建了比较器的多个实例。在您回答Default属性是否是线程安全的之前,我们应该定义我们想要的安全性。如果您只想创建一个实例,那么它肯定不是线程安全的。但是,如果您放弃了允许多个实例的要求,只要返回某些实例,那么肯定会这样做。

我想说这个决定背后的原因部分是因为IComparer实例是无国籍的。这意味着从呼叫者的角度来看,调用者抓住哪个实例并不重要,因为他们看起来和操作都是一样的。换句话说,如果一个线程重复读取Default并且每次都有不同的实例,那真的无关紧要。