2011-04-19 35 views
0

说我有一个static Dictionary<string, object>和想要做的事,如下列事项,除了我只是想锁定我目前处理的,而不是整个字典中的特定字典词条:锁定单个字典条目而不是整个字典?


lock(myDictionary) 
{ 
    if(myDictionary["myKey"] == null) 
    { 
     myDictionary["myKey"] = new MyClass(); 
    } 
} 

这是可能没有写我自己的字典实现?

感谢,

回答

6

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

+0

谢谢你,我不知道这件事。我实际上正在尝试更新ASP.NET应用程序以使线程安全地使用会话状态,并希望有一种方法可以仅锁定部分Session对象而不是整个事物。看起来我必须编写自己的SessionState实现。 – 2011-04-19 23:17:08

+0

@nw从并发的角度来看,你确定ASP.NET会话状态真的是个问题吗?首先阅读http://msdn.microsoft.com/en-us/library/ms178581.aspx底部的“并发请求和会话状态”段落。 – 2011-04-20 06:59:20

+0

我试图解决的主要问题是来自同一会话的请求排队,所以服务器在取消ajax请求后长时间阻塞。当我开始这个线程时,我想会有办法将这个排队关闭,并且我可以自己管理并发,但显然这很难或不可能。会话状态仅用于为每个会话存储一个缓存对象。现在我正在考虑最简单的解决方案就是在将Session ID映射到缓存对象的应用程序状态中放置一个ConcurrentDictionary。你怎么看? – 2011-04-20 19:19:43

1

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

+0

我希望有一个字典的内部结构的特定部分,我可以锁定。字典是用某种散列表实现的吗?例如,如果密钥的哈希值是列表数组中的一个索引(用于处理哈希冲突),那么我可以锁定与我的密钥相关的特定列表,是正确的? – 2011-04-19 23:14:34

+0

是的,根据特定的技术实现,字典将不得不锁定某些特定的子结构。 – 2011-04-20 07:00:23