Синглтон Фабричный элемент Функция безопасности потока - PullRequest
1 голос
/ 01 февраля 2011

Мне нужна одноэлементная фабрика, которая генерирует объекты IPropertyMapper. Фабрика имеет словарь, который содержит ссылки на делегатов Func. Словарь неизменен, я просто хочу быстрый доступ. Будет ли этот код ниже поточно-ориентированным? Является ли вызов Create () потокобезопасным?

определение класса:

public sealed class PropertyMapperFactory
    {
        private static readonly PropertyMapperFactory _instance = new PropertyMapperFactory();

        private readonly Dictionary<int, Func<TResult>> _handlers;

        private PropertyMapperFactory() {
            this._handlers = new Dictionary<...>();
            this._setTimeHandler();
        }

        public static PropertyMapperFactory GetFactory() {
            return _instance;
        }

        //Is this thread safe?
        public IPropertyMapper Create(UnitSetting _units ) {
            return new PropertyMapper(this.handler[0])
        }            

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

Тип Dictionary<TKey, TValue> обычно считается безопасным для чтения из параллельных потоков, но все операции записи должны быть полностью изолированы (никаких других операций записи или чтения одновременно).Если вы не изменяете словарь в любое время после создания, то все будет в порядке.

0 голосов
/ 01 февраля 2011

Если вы никогда не измените значения в словаре после завершения работы конструктора, это нормально. Dictionary<TKey, TValue> поддерживает несколько читателей, пока нет писателей.

...