字典作为线程安全变量

本文关键字:安全 变量 线程 字典 | 更新日期: 2023-09-27 18:29:56

我有一个类(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);  
        }

然后我得到了一些例外,因为项目已经添加,所以我把它改为:

        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?

字典作为线程安全变量

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

编辑-根据意见:

"大多数操作无锁定"这个术语有点过于笼统。。。

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