Это класс Comparer из кода библиотеки SSCLI ThreadSafe? - PullRequest
3 голосов
/ 17 марта 2011
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(); 

может быть не виден другим потокам, кроме создания потока?Итак, создается несколько экземпляров Comparer?

Делает ли Microsoft это ради стоимости синхронизации торговли с затратами на создание нескольких объектов?

Во-вторых, почему defaultComparer сначала назначается переменной сравнениясначала ... а потом поменялись местами?почему Comparer comparer = defaultComparer?

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Да. Несколько компараторов действительно создаются, defaultComparer назначается несколько раз. Не проблема, они все одинаковые. Сборщик мусора заботится о дополнениях. А атомарное присвоение гарантирует, что CLR предлагает для ссылок на объекты, что статическое не может быть прочитано неправильно.

0 голосов
/ 13 июня 2011

Да, конечно, возможно создание нескольких экземпляров компаратора.Прежде чем вы сможете ответить, является ли свойство Default поточно-ориентированным, нам, вероятно, следует определить, что мы хотим, чтобы было безопасным.Если вы когда-нибудь захотите создать только один экземпляр, он, безусловно, не является поточно-ориентированным.Однако, если вы ослабите свое требование разрешить несколько экземпляров при условии, что будет возвращен некоторый экземпляр, тогда это, безусловно, так и будет.Дело в том, что экземпляр IComparer не имеет состояния.Это означает, что с точки зрения вызывающих абонентов действительно не имеет значения, какой экземпляр захватывает вызывающий абонент, поскольку все они выглядят и работают одинаково.Другими словами, действительно не имело бы значения, если один поток неоднократно читал Default и каждый раз получал новый экземпляр.

...