gpt4 book ai didi

c# - 字典作为线程安全变量

转载 作者:行者123 更新时间:2023-11-30 14:00:44 24 4
gpt4 key购买 nike

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

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

最佳答案

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

编辑 - 根据评论:

“大多数操作无锁”这个词有点太笼统了……

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

关于c# - 字典作为线程安全变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9993886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com