Есть ли в .NET реализация Dictionary, эквивалентная Java ConcurrentHashMap? - PullRequest
5 голосов
/ 12 ноября 2008

Напомним, для тех .NET-гуру, которые могут не знать Java API:

ConcurrentHashMap в Java имеет атомарные методы (то есть не требуют внешней блокировки) для обычных операций модификации карты, таких как:

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

Это также позволяет выполнять итерацию по набору ключей без блокировки (для этого требуется копия в начале итерации), а операции get() обычно могут чередоваться с вызовами put() без блокировки (используется мелкозернистое чередование блокировки IIRC ).

В любом случае, мой вопрос: .NET имеет эквивалентную реализацию словаря?

Полагаю, в общем, я бы хотел узнать, есть ли в .NET более общий набор библиотек потоковобезопасных коллекций. Или утилиты параллелизма вообще - эквивалентно библиотекам Дуга Ли java.util.concurrent.

Ответы [ 4 ]

16 голосов
/ 03 января 2010

Входящий .Net 4.0 имеет класс ConcurrentDictionary , имеет удобный метод GetOrAdd .

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

Очень полезно для глобальных серверных кешей.

3 голосов
/ 12 ноября 2008

РЕДАКТИРОВАТЬ: Это было написано до выпуска .NET 4, когда, очевидно, есть ConcurrentDictionary. Я оставляю это здесь как справочник для тех, кто нуждается в .NET 3.5.

Я не знаю ни одного эквивалента ConcurrentHashMap.

С точки зрения общих утилит параллелизма - .NET всегда предоставлял немного больше, чем основы, которые Java использовала для предоставления, в терминах Mutex, ManualResetEvent, AutoResetEvent и ReaderWriterLock; потом (.NET 2.0) Semaphore и (.NET 3.5) ReaderWriterLockSlim - а также пул потоков всего процесса, конечно.

Больший сдвиг произойдет в .NET 4.0, когда появятся Parallel Extensions - это должно упростить параллелизм намного . Аналогично, Coordination and Concurrency Runtime наконец-то освобождается от оков Microsoft Robotics Studio, хотя мне не ясно, куда именно он направляется (будет ли это частью самого .NET или отдельная библиотека).

2 голосов
/ 12 ноября 2008

Лично я считаю, что синхронизация отдельных методов обычно не так полезна, как кажется.

Как правило, вы можете захотеть сделать связанные "get" и "put" в тесной последовательности, и если другой поток просматривает те же значения, у вас есть немедленная гонка потоков. Аналогично (в зависимости от сценария) вы не хотите кто-то читает значения, над которыми вы работаете.

Для широкого подхода простое использование внешнего Monitor (lock(...) может хорошо работать во многих ситуациях. Он прост, легок и, если у вас нет тяжелой нити, чем адекватный.

Для более сложных сценариев такие вещи, как ReaderWriterLockSlim и т. Д. Более гибкие. Но я бы начал с простого и изменил бы все, если профилирование показывает, что есть подлинная проблема конкуренции.

Как отмечает Джон, с Parallel Extension приходит совершенно новый набор высокопроизводительных устройств синхронизации; из того, что я вижу (например, здесь , здесь и здесь ), это часть .NET 4.0

2 голосов
/ 12 ноября 2008

Не то, что я знаю. Наиболее близким к тому, что вы ищете, вероятно, будет метод Synchronized в Hashtable, который возвращает (своего рода) потокобезопасную оболочку вокруг хеш-таблицы. Это только потокобезопасный для нескольких авторов или нескольких читателей, хотя. Если я правильно помню, смесь авторов и читателей не будет потокобезопасной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...