As MSDN说
ConcurrentDictionary<TKey, TValue>类表示可以由多个线程并发访问的键值对的线程安全集合。
但我知道,System.Collections.Concurrent类是为PLINQ设计的。
我有Dictionary<Key,Value>,它在服务器中保持在线客户端,当我访问对象时,我通过锁定对象使它线程安全。
在我的情况下,我能安全地用Dictionary<TKey,TValue>代替ConcurrentDictionary<TKey,TValue>吗?更换后性能会提高吗?
这里在第5部分中提到,它是为并行编程设计的。
发布于 2011-03-14 19:37:14
如果你不知道你在锁里做什么,那就说不出来了。
例如,如果您的所有字典访问都如下所示:
lock(lockObject)
{
foo = dict[key];
}
... // elsewhere
lock(lockObject)
{
dict[key] = foo;
}然后你就可以把它换掉了(虽然你可能不会看到性能上的任何差别,所以如果它没有坏,就不要修复它)。但是,如果在与字典交互的锁块中执行任何花哨的操作,那么必须确保字典提供了一个可以完成在锁块中所做工作的函数,否则您将得到与以前不同的功能代码。要记住的最重要的事情是,字典只保证以串行方式执行对字典的并发调用;它不能处理代码中有一个操作与字典多次交互的情况。如果ConcurrentDictionary没有考虑到这种情况,则需要您自己的并发控制。
值得庆幸的是,ConcurrentDictionary为更常见的多步操作(如AddOrUpdate或GetOrAdd )提供了一些辅助函数,但它们不能涵盖所有情况。如果您发现自己不得不将您的逻辑压缩到这些功能中,那么处理您自己的并发性可能更好。
发布于 2011-03-14 19:40:19
这并不像用Dictionary替换ConcurrentDictionary那么简单,您需要调整代码,因为这些类具有不同行为的新方法,以确保线程安全。
你没有打电话给Add或Remove,而是打了TryAdd和TryRemove。重要的是,使用这些原子化的方法,就好像在第二个调用依赖于第一个调用的结果时,仍然存在争用条件并需要一个lock。
发布于 2011-03-14 19:35:46
您可以用Dictionary<TKey, TValue>替换ConcurrentDictionary<TKey, TValue>。
但是,对性能的影响可能不是您想要的(如果存在大量的锁定/同步,性能可能会suffer...but,至少您的集合是线程安全的)。
https://stackoverflow.com/questions/5303472
复制相似问题