.NET – 词典锁定与ConcurrentDictionary

我找不到ConcurrentDictionary类型的足够信息,所以我想我会在这里问。

目前,我使用字典来保存所有由多个线程(从线程池,所以没有精确的线程数)不断访问的用户,并且它具有同步访问。

我最近发现,在.NET 4.0中有一组线程安全的集合,它似乎是非常令人愉快的。我想知道,什么是“更高效和更容易管理”选项,因为我有一个选择之间有一个正常的字典与同步访问,或有一个ConcurrentDictionary已经线程安全。

Reference to .NET 4.0’s ConcurrentDictionary

可以以不同的方式查看线程安全集合与非线程安全集合。

考虑一个没有店员的商店,除了结帐。如果人们不负责任地行事,你有很多问题。例如,假设客户从金字塔罐头取罐,而店员正在建造金字塔,所有的地方都会松动。或者,如果两个客户同时到达同一个项目,谁赢了?会有战斗吗?这是一个非线程安全集合。有很多方法可以避免问题,但它们都需要某种锁定,或者以某种方式显式访问。

另一方面,考虑一个店员在一个办公桌,一个店员,你只能通过他购物。你走进去,问他一件物品,他把它带回你,你出去了。如果你需要多个项目,你只能拾取尽可能多的项目在每个往返,你可以记得,但你需要小心,以避免囤积店员,这将愤怒其他客户在后面你。

现在考虑这个。在有一个店员的商店,如果你得到所有的方式到线的前面,并问店员“你有卫生纸”,他说“是”,然后你去“好吧,我’当我知道我需要多少钱时,我会回来给你“,那么当你回到线路的前面时,商店当然可以卖完了。线程安全集合不能防止此情况。

线程安全集合保证其内部数据结构在任何时候都是有效的,即使从多个线程访问。

非线程安全收集不附带任何此类保证。例如,如果你在一个线程上向二叉树添加一些东西,而另一个线程正在忙于重新平衡树,那么就不能保证该项将被添加,或者该树仍然有效。

然而,线程安全集合不保证线程上的顺序操作都在其内部数据结构的相同“快照”上工作,这意味着如果您具有这样的代码:

if (tree.Count > 0)
    Debug.WriteLine(tree.First().ToString());

你可能会得到一个NullReferenceException,因为在tree.Count和tree.First()之间,另一个线程已经清除了树中剩余的节点,这意味着First()将返回null。

对于这种情况,你需要看看问题的集合是否有一个安全的方式来获得你想要的,也许你需要重写上面的代码,或者你可能需要锁定。

http://stackoverflow.com/questions/1949131/net-dictionary-locking-vs-concurrentdictionary

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:.NET – 词典锁定与ConcurrentDictionary