字典作为线程安全变量
本文关键字:安全 变量 线程 字典 | 更新日期: 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的本地锁。。。在实际应用中,它提供了比全局锁更好的性能,尤其是多核锁。