C# 锁定单个词典条目而不是整个词典?

C# 锁定单个词典条目而不是整个词典?,c#,thread-safety,locks,C#,Thread Safety,Locks,假设我有一个静态字典,并希望执行以下操作,但我只想锁定当前正在处理的特定字典条目,而不是整个字典: lock(myDictionary) { if(myDictionary["myKey"] == null) { myDictionary["myKey"] = new MyClass(); } } 如果不编写自己的字典实现,这是可能的吗 谢谢,您可以使用新类。通过以比锁定整个字典更细粒度的方式锁定,它有效地提供了线程安全性。试试看在您的情况下,仅“锁定特定字典条

假设我有一个
静态字典
,并希望执行以下操作,但我只想锁定当前正在处理的特定字典条目,而不是整个字典:


lock(myDictionary)
{
   if(myDictionary["myKey"] == null)
   {
      myDictionary["myKey"] = new MyClass();
   }
}
如果不编写自己的字典实现,这是可能的吗


谢谢,

您可以使用新类。通过以比锁定整个字典更细粒度的方式锁定,它有效地提供了线程安全性。

试试看

在您的情况下,仅“锁定特定字典条目”是没有意义的;即使您编写了自己的实现。如果您不知道条目是否存在,并且在这种情况下希望将其添加到字典中,则必须始终同步对字典控制结构的访问。换句话说,即使您自己实现它,也需要同步访问至少其内部结构的某一部分。

我希望字典的内部结构中有一个特定部分可以锁定。字典是用某种哈希表实现的吗?例如,如果密钥的散列是列表数组的索引(用于处理散列冲突),那么我可以锁定与密钥相关联的特定列表,对吗?是的,根据特定的技术实现,字典必须锁定某些特定的子结构。谢谢,我不知道这一点。实际上,我正在尝试更新一个ASP.NET应用程序,以使线程安全地使用会话状态,并希望有一种方法可以锁定会话对象的一部分,而不是整个对象。看起来我必须编写自己的SessionState实现。@从并发性的角度看,你确定ASP.NET会话状态真的是个问题吗?相反,首先阅读的是文章底部的“并发请求和会话状态”一段。我试图解决的主要问题是,来自同一会话的请求排队,因此服务器在取消ajax请求后会阻塞很长一段时间。当我启动这个线程时,我想有一种方法可以关闭这个队列,并且我可以自己管理并发性,但显然这很难或不可能。会话状态仅用于每个会话存储一个缓存对象。现在我认为最简单的解决方案是将ConcurrentDictionary置于应用程序状态,将会话ID映射到缓存对象。你觉得怎么样?@nw:你可以试着这样做,但是你会遇到一个问题,那就是要确保它被正确清除,否则会导致内存泄漏。如果你能让那部分正常工作,从技术上讲,它应该能工作。