回顾那些可能不了解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 Lea的java.util.concurrent
库。
答案 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
。
就通用并发实用程序而言 - 就Mutex
,ManualResetEvent
,AutoResetEvent
和{{ReaderWriterLock
,Semaphore
,ReaderWriterLockSlim
和{{{{}}提供的内容而言,.NET总是提供了一些以上的基础知识。 3}};然后是最近(.NET 2.0)Coordination and Concurrency Runtime和(.NET 3.5){{3}} - 当然还有进程范围的线程池。
答案 2 :(得分:2)
不是我知道的。你正在寻找的最接近的东西可能是Hashtable的Synchronized方法,它返回哈希表周围的(某种)线程安全包装器。但是,它对于多个编写器或多个读者来说只是线程安全的。如果我没记错的话,作者和读者的混合将不是线程安全的。
答案 3 :(得分:2)
就我个人而言,我发现将个别方法统一为一般并不像听起来那么有用。
通常,您可能希望以紧密连续的方式执行相关的“get”和“put”,如果另一个线程正在查看相同的值,则您会立即进行线程竞争。同样地(取决于场景)你不想要某人阅读你正在使用的值。
对于广泛的方法,只需使用外部Monitor
(lock(...)
就可以在很多情况下使用。它很简单,重量轻,除非你在重线程负载,绰绰有余。
对于更复杂的场景,ReaderWriterLockSlim
等内容更灵活。但是我开始很简单,只有在分析显示存在真正的争用问题时才会改变。
Jon指出,Parallel Extension带来了全新的高性能同步设备;从我所看到的(例如here,here和here),这是.NET 4.0的一部分