有什么需要翻译的吗?
有什么需要翻译的吗?
有一个通用的Dictionary类用于实现关联数组(也称为哈希表)。最近,MS推出了ConcurrentDictionary类:http://msdn.microsoft.com/en-us/library/dd287191.aspx,这可能是你想要的。不过它只适用于.Net 4+ :(
我不熟悉你所说的ConcurrentHashMap
。也许你可以定义一下它在C#中需要执行的功能。
如果你只想保证集合在并发访问时是线程安全的,那么最好定义自己的锁策略来控制对其的访问。
早期版本的.NET框架中看到的Hashtable.Synchronised(...)
方法已被删除(以及所有ICollection.SyncRoot实现的隐藏通过在System.Collections.Generic
中显式实现)。这是因为每当你在公共可访问对象上锁定时,你就打开了其他调用者以无法控制的方式锁定你的对象的可能性,从而导致死锁的可能性。
此外,“同步”集合只能保证对单个成员的调用是安全的,但许多情况涉及“事务”,包括许多成员。请考虑以下示例:
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
。
Contains
是线程安全的?如果你没有在你的线程锁定集合时调用它,另一个线程可能会修改它(也许执行内部调整大小),结果可能是不可预测的。我更喜欢总是锁定,除非有关对象的文档明确说明特定成员对于多个读者和一个写入器是线程安全的(就像一些框架成员一样)。 - Drew NoakesC#(以及.NET的其他部分)具有Hashtable...它位于System.Collections中。我不确定Java中的“Concurrent”HashMap是什么,但是当只有一个写入者和任意数量的读取者时,Hashtable应该是线程安全的...除此之外,您必须自己管理并发性。