Словарь как переменная потока - PullRequest
3 голосов
/ 03 апреля 2012

У меня есть класс (singleton), и он содержит статический словарь

private static Dictionary<string, RepositoryServiceProvider> repositoryServices = null;

. В экземпляре этого класса я заполняю словарь (может происходить из нескольких потоков).Сначала у меня было только

        RepositoryServiceProvider service = null; 
        repositoryServices.TryGetValue(this.Server.Name, out service);
        if (service == null) {
          service = new RepositoryServiceProvider(this.Server);
          repositoryServices.Add(this.Server.Name, service);  
        }

, затем я получил некоторые исключения, так как Item уже добавлен, поэтому я изменил его на:

        RepositoryServiceProvider service = null;    
        repositoryServices.TryGetValue(this.Server.Name, out service);
        if (service == null) {
          lock (padlock) {
            repositoryServices.TryGetValue(this.Server.Name, out service);
            if (service == null) {
              service = new RepositoryServiceProvider(this.Server);
              repositoryServices.Add(this.Server.Name, service);  
            }
          }
        }

, и замок находится в классе:

private static readonly object padlock = new object();

безопасен ли этот поток?или его слишком сложно?или я должен использовать ConcurentDictionary ?

1 Ответ

8 голосов
/ 03 апреля 2012

ЕСЛИ вы можете использовать ConcurrentDictionary - это в нескольких ситуациях быстрее, чем ваш подход, потому что он реализует большинство операций без блокировки, в то же время будучи поточно-ориентированным.

РЕДАКТИРОВАТЬ - согласнокомментарии:

Термин "большинство операций без блокировки" является слишком общим ...

По сути, это означает снижение конкуренции ..., таким образом, в некоторых случаях более высокая эффективность по сравнению с ситуацией содна глобальная блокировка, то есть доступ ко второму сегменту, когда первый блок заблокирован, работает так, как если бы не было блокировки от POV кода доступа ... хотя это означает блокировку, локальную для этого сегмента ... в реальных приложениях этообеспечивает гораздо лучшую производительность, чем глобальная блокировка - esp.с многоядерным процессором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...