.net 如何同时更新两个词典
我需要支持更新两个并发字典的功能(创建、更新、删除)。.net 如何同时更新两个词典,.net,c#-4.0,concurrency,thread-safety,.net,C# 4.0,Concurrency,Thread Safety,我需要支持更新两个并发字典的功能(创建、更新、删除)。 每个操作(更新、删除、创建)使用其中两个操作,并且应该是原子操作。在.NET C#中执行此操作的最佳方法是什么。最简单的方法是使用锁: private object m_methodMonitor = new object(); private void Update() { lock (m_methodMonitor) { // Do whatever } } private void Del
每个操作(更新、删除、创建)使用其中两个操作,并且应该是原子操作。在.NET C#中执行此操作的最佳方法是什么。最简单的方法是使用锁:
private object m_methodMonitor = new object();
private void Update()
{
lock (m_methodMonitor)
{
// Do whatever
}
}
private void Delete()
{
lock (m_methodMonitor)
{
// Do whatever
}
}
请注意:锁定字典上的“写入”操作是不够的!您还需要同步字典的读取,以避免在尝试从字典中获取值时出现这种情况,该值当前正由其中一个更新方法访问。这里的挑战是要求两个字典都必须进行原子修改。
ConcurrentDictionary
类没有任何内置机制来支持将实例“分组”在一起,以允许同时更新共享同一密钥的键值对
因此,您无法使用任何高吞吐量机制来授予您操作中的原子性
要对一组对象执行原子操作,您唯一能做的就是将对对象的访问包装在锁定机制中:
public void Update(...)
{
lock(this.dictionaryLock)
{
this.dictionaryA.AddOrUpdate(...);
this.dictionaryB.AddOrUpdate(...);
}
}
使用不同的锁定机制,优化应用程序的常见模式(例如,如果应用程序倾向于频繁阅读和不频繁修改,则使用a),可能会获得更好的结果,但只能序列化对整个字典的访问
如果并发性能对您非常重要,则必须重构设计,以使用一个而不是两个并发字典。每个键的锁定机制如何?应该注意,要使其在访问字典实例的任何地方都能工作,必须在类似的
lock
语句中执行,不仅仅是对列出的三个操作。@user547297:每个键锁定是不可能的,而且也不是必需的。与只在插入/更新/删除所需的较短时间内锁定整个词典相比,实现锁定词典中单个条目的操作会带来更多开销。我不明白为什么需要使用两个锁?此外,每当您使用两个锁时,如果您沿着两个代码路径尝试以不同的顺序获取锁,则会有死锁的风险。-1表示使用两个锁。这是危险的,没有必要的!当你说“并发字典”时,你指的是什么类别?System.Collections.concurrent.ConcurrentDictionary