【问题标题】:A .Net4 Gem: The ConcurrentDictionary - Tips & Tricks.Net4 Gem:ConcurrentDictionary - 提示和技巧
【发布时间】:2011-02-10 07:26:19
【问题描述】:

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

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

您的使用体验如何?

【问题讨论】:

    标签: .net .net-4.0 concurrency


    【解决方案1】:

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

    if (!dictionary.ContainsKey(key))
    {
        // Another thread may have beaten you to it
        dictionary.Add(key, value);
    }
    

    改为使用新的线程安全 API - 例如 AddOrUpdate(在比赛条件下最后一个获胜)或GetOrAdd(在比赛条件下第一个获胜)。

    【讨论】:

    • 我现在要等待更多回复,马丁。谢谢:)
    • 请注意,MS 文档在这里说:msdn.microsoft.com/en-us/library/dd997369.aspx GetOrAdd 和 AddOrUpdate 可能不会返回您插入的相同项目。我相信这仅适用于方法的 Function 变体,但写作含糊不清。
    • @evilfred,这确实适用于 Func 变体 - 描述清楚地说明了这一点。 Func 变体本质上允许您创建一个延迟加载的字典,实际上我希望所有线程都使用相同的委托,并且委托的多次调用返回的结果是可互换的(例如,不可变的)。
    • AddOrUpdateGetOrAdd 第一个返回的工厂将赢得比赛,所有调用者都将收到该值。 @evilfred:只插入一个值,它将是返回的值。但是,它可能不是you 计算的值(如果 you 输掉了比赛)。
    • @NigelTouch,我不同意。使用 AddOrUpdate,最后一个调用者将“获胜”,即更新任何现有值并返回更新后的值。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • GetOrAdd()AddOrUpdate() 中使用的值工厂方法不是线程安全的,这里还是需要深思熟虑的。
      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多