.NET是否具有与Java的ConcurrentHashMap等效的Dictionary实现?

时间:2008-11-12 09:02:35

标签: .net concurrency dictionary map

回顾那些可能不了解Java API的.NET专家:

Java中的

ConcurrentHashMap具有原子方法(即不需要外部锁定),用于常见的Map修改操作,例如:

putIfAbsent(K key, V value)
remove(Object key, Object value)
replace(K key, V value)

它还允许在不锁定的情况下迭代键集(在迭代开始时需要复制),get()操作通常可以与put()的调用交错而不会阻塞(它使用细粒度锁定条带化IIRC)。

无论如何,我的问题是: .NET是否具有等效的Dictionary实现?

我想更普遍的是,我很想知道.NET是否有更通用的线程安全集合库。或者一般的并发实用程序 - 相当于Doug Leajava.util.concurrent库。

4 个答案:

答案 0 :(得分:16)

传入的.Net 4.0有一个ConcurrentDictionary类,它有一个方便的GetOrAdd方法。

public TValue GetOrAdd(
    TKey key,
    Func<TKey, TValue> valueFactory
)

对全局服务器缓存非常有用。

答案 1 :(得分:3)

编辑:这是在.NET 4发布之前编写的,显然有ConcurrentDictionary。我将它留在这里作为那些需要.NET 3.5的人的参考。

我不知道任何等同于ConcurrentHashMap

就通用并发实用程序而言 - 就MutexManualResetEventAutoResetEvent和{{ReaderWriterLockSemaphoreReaderWriterLockSlim和{{{{}}提供的内容而言,.NET总是提供了一些以上的基础知识。 3}};然后是最近(.NET 2.0)Coordination and Concurrency Runtime和(.NET 3.5){{3}} - 当然还有进程范围的线程池。

当并行扩展到来时,.NET 4.0将出现更大的变革 - 这应该使并发更多更简单。同样地,{{3}}最终摆脱了微软机器人工作室的束缚,虽然我不知道它到底在哪里(它是否是.NET本身的一部分,或者是一个单独的库)。 / p>

答案 2 :(得分:2)

不是我知道的。你正在寻找的最接近的东西可能是Hashtable的Synchronized方法,它返回哈希表周围的(某种)线程安全包装器。但是,它对于多个编写器或多个读者来说只是线程安全的。如果我没记错的话,作者和读者的混合将不是线程安全的。

答案 3 :(得分:2)

就我个人而言,我发现将个别方法统一为一般并不像听起来那么有用。

通常,您可能希望以紧密连续的方式执行相关的“get”和“put”,如果另一个线程正在查看相同的值,则您会立即进行线程竞争。同样地(取决于场景)你不想要某人阅读你正在使用的值。

对于广泛的方法,只需使用外部Monitorlock(...)就可以在很多情况下使用。它很简单,重量轻,除非你在线程负载,绰绰有余。

对于更复杂的场景,ReaderWriterLockSlim等内容更灵活。但是我开始很简单,只有在分析显示存在真正的争用问题时才会改变。

Jon指出,Parallel Extension带来了全新的高性能同步设备;从我所看到的(例如hereherehere),这是.NET 4.0的一部分