Подтвердить что ты не робот

Безопасная хеш-карта?

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

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


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


Проблемы, с которыми я сталкиваюсь


  • Если пользователь пытается обновить MAP, и одновременно MAP обновляется на сервере → Проблема параллельной записи.
  • Если использование пытается прочитать что-то из MAP, и одновременно MAP обновляется в режиме backend → одновременная работа READ и WRITE Operation.

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 3

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

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

javadoc of ConcurrentHashMap