首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个比较器类是来自SSCLI库的代码ThreadSafe吗?

这个比较器类是来自SSCLI库的代码ThreadSafe吗?
EN

Stack Overflow用户
提问于 2011-03-17 07:40:52
回答 2查看 80关注 0票数 3
代码语言:javascript
复制
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;
            }
        }

首先,默认属性线程安全吗?有没有可能下面这句话的效果

代码语言:javascript
复制
comparer = CreateComparer(); 

可能对创建线程以外的其他线程不可见?所以,比较器的多个实例被构造了吗?

微软这样做是为了用创建多个对象的成本来换取同步成本吗?

第二,为什么首先将defaultComparer赋值给比较器变量first...and,然后再赋值给交换变量?为什么Comparer comparer = defaultComparer?

EN

回答 2

Stack Overflow用户

发布于 2011-03-17 07:47:34

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

票数 1
EN

Stack Overflow用户

发布于 2011-06-14 01:53:51

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

我想说,这个决定背后的原因部分是基于IComparer实例是无状态的这一事实。这意味着从调用者的角度来看,调用者抓取哪个实例并不重要,因为它们看起来和操作都是一样的。换句话说,即使单个线程重复读取Default并每次都获得一个不同的实例,这也无关紧要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5333138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档