Ориентированная на многопотоковое исполнение Карта Хеша?

Я пишу приложение, которое возвратит HashMap пользователю. Пользователь получит ссылку на этот MAP. На бэкенде я буду выполнять некоторые потоки, которые обновят Карту.

Что я сделал до сих пор?


Я заставил все потоки бэкенда так совместно использовать общий канал для обновления MAP. Таким образом в бэкенде я уверен, что параллельная операция записи не будет проблемой.


Проблемы я имею


  1. Если пользователь пытается обновить MAP, и одновременно MAP обновляется в бэкенде-> Параллельная проблема операции записи.
  2. Если использование пытается считать что-то из MAP, и одновременно MAP обновляется в бэкенде-> параллельная проблема Операции чтения и Операции записи.

Непока теперь я не имею, сталкиваются с любой такой проблемой, но я боюсь, что могу столкнуться в будущем. Дайте sugesstions.

Я использую ConcurrentHashMap<String, String>.

41
задан Reimius 7 August 2015 в 16:15
поделиться

3 ответа

Вы на правильном пути, используя ConcurrentHashMap . Для каждой точки:

  1. Обратите внимание на методы putIfAbsent и replace , оба являются потокобезопасными и объединяют проверку текущего состояния хэш-карты и его обновление в одну атомарную операцию.
  2. Метод get не синхронизируется внутри, но возвращает самое последнее значение для указанного ключа, доступного ему (см. Javadoc класса ConcurrentHashMap для обсуждения ).

Преимущество ConcurrentHashMap над чем-то вроде Collections.synchronizedMap - это комбинированные методы, такие как putIfAbsent , которые предоставляют традиционные Map get и помещает логику во внутреннюю синхронизацию.Используйте эти методы, и не пытайтесь обеспечить вашу собственную синхронизацию через ConcurrentHashMap , так как это не сработает. Коллекции java.util.concurrent внутренне синхронизированы, и другие потоки не будут отвечать на попытки синхронизации объекта (например, synchronize (myConcurrentHashMap) {} не будет блокировать другие потоки).

53
ответ дан 27 November 2019 в 00:46
поделиться

Side Note:

Возможно, вам стоит обратить внимание на реализацию хэш-таблицы без блокировок от Клиффа Клика, это часть библиотеки Highly Scalable Java

(Вот Google Talk Клиффа Клика об этом хэше без блокировок)

.
8
ответ дан 27 November 2019 в 00:46
поделиться

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

Хеш-таблица, поддерживающая полную параллелизм поиска и регулируемый ожидаемый параллелизм для обновления. обновления.

Javadoc ConcurrentHashMap

0
ответ дан 27 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: