有什么?
答案 0 :(得分:7)
有一个通用的Dictionary类用于实现关联数组(也就是哈希表)。最近MS推出了ConcurrentDictionary类:http://msdn.microsoft.com/en-us/library/dd287191.aspx,这可能是你想要的。这是.Net 4+。 :(
答案 1 :(得分:5)
ConcurrentHashMap的基本思想是它是线程安全的,不需要锁。 因此,所有“使用锁定思想”都是基本的,就像你说“使用Java”一样。
在内部,您使用一些CAS(比较和交换)操作并保证无论如何 线程如何运行一些不变量始终保持为真。既然你没有相互排斥 (唯一原子的是硬件中的CAS操作),你完全避免了死锁的可能性,通常也有一些性能提升。 当然,数据结构的实现(很多)更复杂(这就是为什么准备一个很酷的原因,或者实现它甚至证明它是一个痛苦的原因) 它实际上适用于更多线程)。
我希望.NET框架中也有这样的东西。
答案 2 :(得分:2)
我不熟悉你所说的ConcurrentHashMap
。也许您可以定义它在C#中所执行的功能。
如果您只是想保证集合对于并发访问是线程安全的,那么您最好定义自己的锁定策略来控制对它的访问。
早期版本的.NET框架中看到的Hashtable.Synchronised(...)
方法已被删除(同时通过System.Collections.Generic
中的显式实现隐藏了所有ICollection.SyncRoot实现)。这是因为无论何时锁定可公开访问的对象,您都可以让其他调用者以您无法控制的方式锁定对象,从而实现死锁。
此外,“同步”集合只能保证对个别成员的呼叫是安全的,但是许多情况涉及包括许多成员的“交易”。请考虑以下示例:
if (collection.Contains(item))
collection.Get(item);
map
对象(无论它是什么类型)都可以保证Contains
和Get
方法都是线程安全的,但它不能保证项目仍然包含在内在调用时Get
的地图中。相反,你应该使用这样的代码:
private readonly object _mapLock = new object();
public void Method()
{
lock (_mapLock)
{
if (collection.Contains(item))
collection.Get(item);
}
}
@Oskar建议使用ReaderWriterLock
。这个类有一个糟糕的实现,性能比简单的锁定更差。如果您使用的是较新版本的框架,请改用ReaderWriterLockSlim
。
答案 3 :(得分:-1)
C#(与.NET的其余部分一起)有一个Hashtable ......它位于System.Collections中。我不确定java中的“并发”HashMap是什么,但是当只有一个编写器和任意数量的读者时,Hashtable应该是线程安全的...除此之外,你必须自己管理并发。 / p>