字典作为线程安全的变量

时间:2012-04-03 13:04:29

标签: c# dictionary static thread-safety

我有一个类(单例),它包含一个静态字典

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 个答案:

答案 0 :(得分:8)

如果您可以使用ConcurrentDictionary - 它在某些情况下比您的方法更快,因为它在线程安全的情况下实现了大多数无锁操作。

编辑 - 根据评论:

术语“大多数操作无锁”有点过于笼统......

基本上它意味着减少争用...因此在某些情况下与具有一个全局锁定的情况相比效率更高,即在第一个存储桶被锁定时访问第二个存储桶就好像没有来自访问的POV的锁定代码...虽然这意味着该桶的本地锁定...在实际应用程序中,它提供了比全局锁定更好的性能 - 尤其是。多核心。