A.NET4GEM:ConcurrentDictionary-Tips&;诡计

A.NET4GEM:ConcurrentDictionary-Tips&;诡计,.net,.net-4.0,concurrency,.net,.net 4.0,Concurrency,我从.Net4开始使用新的ConcurrentDictionary为线程项目实现一个简单的缓存 但是我想知道在使用它的时候我需要注意什么? 您使用它有什么经验?ConcurrentDictionary是线程安全的。即使从多个线程使用它,也不必担心它 到目前为止,我对并发集合对象没有任何问题。它们极大地提高了我的工作效率,使我能够不必担心集合的并发性问题,并专注于编写应用程序逻辑 这并不是说没有问题。我没有遇到任何问题。成员是线程安全的,但您不应该期望一系列调用是线程安全的。例如,您不能期望以下内

我从.Net4开始使用新的ConcurrentDictionary为线程项目实现一个简单的缓存

但是我想知道在使用它的时候我需要注意什么?


您使用它有什么经验?

ConcurrentDictionary是线程安全的。即使从多个线程使用它,也不必担心它

到目前为止,我对并发集合对象没有任何问题。它们极大地提高了我的工作效率,使我能够不必担心集合的并发性问题,并专注于编写应用程序逻辑


这并不是说没有问题。我没有遇到任何问题。

成员是线程安全的,但您不应该期望一系列调用是线程安全的。例如,您不能期望以下内容是线程安全的:

if (!dictionary.ContainsKey(key))
{
    // Another thread may have beaten you to it
    dictionary.Add(key, value);
}
相反,使用新的线程安全API-例如。
AddOrUpdate
(最后一个在比赛条件下获胜)或
GetOrAdd
(第一个在比赛条件下获胜)。

我现在要等待更多的回应,Martin。谢谢:)请注意,MS文档在这里说:GetOrAdd和AddOrUpdate可能不会返回您插入的相同项目。我相信这只适用于方法的函数变量,但书写方式不明确。@evilfred,这确实适用于Func变量-描述清楚了这一点。Func变量本质上允许您创建一个延迟加载的字典,实际上,我希望所有线程都使用同一个委托,并且多次调用委托返回的结果是可互换的(例如,不可变的)。通过
AddOrUpdate
GetOrAdd
两种方式,第一个返回的工厂将赢得比赛,所有呼叫者都将收到该值@Evilefred:只插入一个值,它将是返回的值。然而,这可能不是你计算的值(如果你输了比赛)。@NigelTouch,我不同意。使用AddOrUpdate,最后一个调用方将“赢”,即将更新任何现有值并返回更新后的值。
GetOrAdd()
AddOrUpdate()
中使用的值工厂方法不是线程安全的,这里仍然需要仔细考虑。