【发布时间】:2011-02-10 07:26:19
【问题描述】:
我开始使用 .Net4 中的新 ConcurrentDictionary 为线程项目实现简单的缓存。
但是我想知道在使用它时我需要注意/注意什么?
您的使用体验如何?
【问题讨论】:
标签: .net .net-4.0 concurrency
我开始使用 .Net4 中的新 ConcurrentDictionary 为线程项目实现简单的缓存。
但是我想知道在使用它时我需要注意/注意什么?
您的使用体验如何?
【问题讨论】:
标签: .net .net-4.0 concurrency
成员是线程安全的,但您不应期望调用序列是线程安全的。例如,您不能期望以下内容是线程安全的:
if (!dictionary.ContainsKey(key))
{
// Another thread may have beaten you to it
dictionary.Add(key, value);
}
改为使用新的线程安全 API - 例如
AddOrUpdate(在比赛条件下最后一个获胜)或GetOrAdd(在比赛条件下第一个获胜)。
【讨论】:
AddOrUpdate 和 GetOrAdd 第一个返回的工厂将赢得比赛,所有调用者都将收到该值。 @evilfred:只插入一个值,它将是返回的值。但是,它可能不是是 you 计算的值(如果 you 输掉了比赛)。
到目前为止,我对并发集合对象没有任何问题。它们让我不担心集合的并发问题并专注于编写应用程序逻辑,从而极大地提高了我的工作效率。
这并不是说没有问题。我没有遇到任何问题。
【讨论】:
ConcurrentDictionary 是线程安全的。即使从多个线程中使用它,您也不必担心它。
【讨论】:
GetOrAdd() 和AddOrUpdate() 中使用的值工厂方法不是线程安全的,这里还是需要深思熟虑的。