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;
}
}首先,默认属性线程安全吗?有没有可能下面这句话的效果
comparer = CreateComparer(); 可能对创建线程以外的其他线程不可见?所以,比较器的多个实例被构造了吗?
微软这样做是为了用创建多个对象的成本来换取同步成本吗?
第二,为什么首先将defaultComparer赋值给比较器变量first...and,然后再赋值给交换变量?为什么Comparer comparer = defaultComparer?
发布于 2011-03-17 07:47:34
是。多个比较器确实被创建了,defaultComparer被分配了多次。没问题,它们都是一样的。垃圾收集器负责额外的任务。CLR为对象引用提供的原子赋值保证可确保不会错误地读取静态对象。
发布于 2011-06-14 01:53:51
在您可以回答Default属性是否是线程安全的之前,我们可能应该定义我们想要安全的东西。如果你只想创建一个实例,那么它肯定不是线程安全的。但是,如果您放宽要求,允许多个实例,只要某个实例被返回,那么它肯定会这样做。
我想说,这个决定背后的原因部分是基于IComparer实例是无状态的这一事实。这意味着从调用者的角度来看,调用者抓取哪个实例并不重要,因为它们看起来和操作都是一样的。换句话说,即使单个线程重复读取Default并每次都获得一个不同的实例,这也无关紧要。
https://stackoverflow.com/questions/5333138
复制相似问题