Безопасный поток Hash Map? - PullRequest
40 голосов
/ 11 июля 2010

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

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


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


Проблемы, которые у меня возникают


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

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

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

Ответы [ 3 ]

53 голосов
/ 11 июля 2010

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

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

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

8 голосов
/ 11 июля 2010

Примечание:

Возможно, вы захотите взглянуть на реализацию бесплатной хеш-таблицы без блокировок с помощью Cliff Click, она является частью Высоко масштабируемой библиотеки Java

(Вотa Google Talk от Cliff Нажмите на этот бесплатный хеш блокировки.)

0 голосов
/ 11 июля 2010

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

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

javadoc of ConcurrentHashMap

...