Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net NET是否有与Java';这是什么地图?_.net_Concurrency_Dictionary_Map - Fatal编程技术网

.net NET是否有与Java';这是什么地图?

.net NET是否有与Java';这是什么地图?,.net,concurrency,dictionary,map,.net,Concurrency,Dictionary,Map,对于那些可能不了解Java API的.NET大师来说: Java中有原子方法(即不需要外部锁定)用于常见的地图修改操作,例如: putIfAbsent(K key, V value) remove(Object key, Object value) replace(K key, V value) 它还允许在不锁定的情况下对密钥集进行迭代(它在迭代开始时获取一个副本),并且get()操作通常可以与对put()的调用交错,而不会阻塞(它使用细粒度锁条带化) 无论如何,我的问题是:.NET是否有等效

对于那些可能不了解Java API的.NET大师来说:

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

putIfAbsent(K key, V value)
remove(Object key, Object value)
replace(K key, V value)
它还允许在不锁定的情况下对密钥集进行迭代(它在迭代开始时获取一个副本),并且
get()
操作通常可以与对
put()
的调用交错,而不会阻塞(它使用细粒度锁条带化)

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


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

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

我不知道有任何等效于
ConcurrentHashMap

就一般并发实用程序而言,.NET总是提供比Java所提供的基本功能多一点的功能,如和;然后是最近的(.NET2.0)和(.NET3.5)-当然还有进程范围的线程池


当并行扩展到来时,.NET4.0将发生更大的变化,这将使并发更加简单。类似地,微软机器人工作室终于摆脱了束缚,尽管我不清楚它的确切发展方向(它是.NET本身的一部分,还是一个独立的库)。

我不知道。最接近您要查找的内容可能是哈希表的Synchronized方法,它在哈希表周围返回(某种)线程安全包装器。不过,对于多个编写器或多个读者来说,它是唯一线程安全的。如果我没有记错的话,编写器和读取器的混合将不会是线程安全的。

就我个人而言,我发现将单个方法同步通常没有听起来那么有用

通常情况下,您可能需要连续执行相关的“get”和“put”,如果另一个线程正在查看相同的值,则会立即进行线程竞争。同样(取决于场景),您不希望有人读取您正在处理的值

对于更广泛的方法,只需使用外部
监视器
锁(…)
)就可以在许多情况下很好地工作。它简单、重量轻,并且除非您在线程负载下,否则就足够了

对于更复杂的场景,像
ReaderWriterLockSlim
等更灵活。但我会从简单开始,并且只有在分析显示存在真正的争用问题时才进行更改


正如Jon所指出的,并行扩展带来了一系列全新的高性能同步设备;从我所看到的(例如,和),这是.NET 4.0的一部分。传入的.NET 4.0有一个类,它有一个方便的方法

public TValue GetOrAdd(
TKey键,
Func价值工厂
)

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

我(从公开的MSDN博客上)觉得它注定会成为.NET 4.0本身的核心部分。谢谢你的回答Jon。并行扩展看起来非常有趣。我要说的是——我不是在玩——这并不是“Java的库比.NET更好”rant.我刚接触.net,很想看看有什么现成的。Marc:CCR作为.net 4.0的一部分?链接是受欢迎的!Serg:别担心,我不是这么认为的:)@Jon:因为过时了,但现在你已经更新了,我删除了否决票。:-)@乔恩·哈洛普:谢谢。在将来,如果您在否决投票时发表评论,将有助于让回答者更清楚地知道应该改进什么。在Java的ConcurrentHashMap中,单独的get、replace、putIfAbsent等方法是不同步的。在大多数负载情况下,它们使用非阻塞算法工作而不锁定。我来看看ReaderWriterLockSlim——谢谢你的提示。你真的需要java标签吗?Georgy——你说得对——这是一个.net问题,不是java问题。标记已删除。我的项目有一个分片字典,它允许多个读写器,并允许对某些值进行事务处理。但它仍在大量开发中…对于全局服务器缓存,最好使用
MemoryCache
对象,否则,如果不从
ConcurrentDictionary
手动删除引用的对象,您可能会泄漏内存。请注意,GetOrAdd的valueFactory可以执行多次,并且不是原子的,如所示和所示
public TValue GetOrAdd(
    TKey key,
    Func<TKey, TValue> valueFactory
)