Это класс Comparer из кода библиотеки SSCLI ThreadSafe?
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 ответа
Да. Несколько компараторов действительно создаются, defaultComparer назначается несколько раз. Не проблема, они все одинаковые. Сборщик мусора заботится о дополнительных услугах. А атомарное присваивание гарантирует, что CLR предлагает для ссылок на объекты, что статическое не может быть прочитано неправильно.
Да, конечно, возможно создание нескольких экземпляров компаратора. Прежде чем вы сможете ответить, является ли Default
свойство является потокобезопасным, мы, вероятно, должны определить, что мы хотим быть безопасными. Если вы когда-нибудь захотите создать только один экземпляр, он, конечно, не является поточно-ориентированным. Однако, если вы ослабите свое требование разрешить использование нескольких экземпляров при условии, что возвращен какой-то экземпляр, он, безусловно, сделает это.
Я бы сказал, что обоснование этого решения было частично основано на том факте, что IComparer
Экземпляр не имеет статуса. Это означает, что с точки зрения вызывающего абонента действительно не имеет значения, какой экземпляр захватывает вызывающий абонент, потому что все они выглядят и работают одинаково. Другими словами, это действительно не имело бы значения, если бы один поток неоднократно читал Default
и каждый раз получал новый экземпляр