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

目前,我使用Dictionary为了让所有通过多个线程(从线程池,没有确切的线程)持续访问的所有用户,并且它具有同步的访问权限。

我最近发现,.NET 4.0中有一套线程安全系列,这似乎非常令人愉悦。我想知道,“更有效,更易于管理"选项将是什么,因为我有一个正常的选择Dictionary使用同步访问或具有ConcurrentDictionary这已经是线程安全了。

引用.NET 4.0ConcurrentDictionary

答案

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

考虑一个没有文员的商店,除了结帐时。如果人们不负责任地采取行动,您会有很多问题。例如,假设客户在店员目前正在建造金字塔时从金字塔式罐中拿起一罐,所有地狱都会松散。或者,如果两个客户同时赢得同一商品,谁赢了该怎么办?会打架吗?这是一个非线程安全收集。有很多方法可以避免问题,但是它们都需要某种锁定,或者以某种方式明确访问。

另一方面,请考虑一家商店的店员在桌子上,您只能通过他购物。你排队,问他一个物品,他把它带回你身上,你走了。如果您需要多个物品,则只能记得每个往返上的物品,但您需要小心避免让店员陪伴,这会激怒其他客户在您身后。

现在考虑一下。在商店里有一个店员,如果您一路走到线的前面,问店员"您有厕纸吗?当我知道我需要多少时,请回到你身边。线程安全集合不会阻止这种情况。

线程安全集合可以确保其内部数据结构始终有效,即使从多个线程访问。

非线程安全系列没有任何此类保证。例如,如果您在一个线程上的二进制树上添加了一些东西,而另一个线程则忙于重新平衡树,则不能保证该物品会被添加,或者即使这棵树之后仍然有效,它可能会损坏希望超出希望。

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

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

you might get a NullReferenceException because inbetween tree.Counttree.First(),另一个线程清除了树上的其余节点,这意味着First()将返回null

在这种情况下,您要么需要查看有关集合是否有一种安全的方法来获得所需的东西,也许您需要重写上面的代码,或者您可能需要锁定。

来自: stackoverflow.com