Безопасная хеш-карта?
Я пишу приложение, которое вернет пользователю HashMap. Пользователь получит ссылку на этот MAP.
На бэкэнд я буду запускать некоторые потоки, которые будут обновлять карту.
Что я сделал до сих пор?
Я сделал все обратные потоки, поэтому обмениваюсь общим каналом для обновления MAP. Поэтому в бэкэнд я уверен, что одновременная операция записи не будет проблемой.
Проблемы, с которыми я сталкиваюсь
- Если пользователь пытается обновить MAP, и одновременно MAP обновляется на сервере → Проблема параллельной записи.
- Если использование пытается прочитать что-то из MAP, и одновременно MAP обновляется в режиме backend → одновременная работа READ и WRITE Operation.
До сих пор я не сталкивался с такой проблемой, но я боюсь, что в будущем могу столкнуться. Пожалуйста, дайте sugesstions.
Я использую ConcurrentHashMap<String, String>.
Ответы
Ответ 1
Вы находитесь на правильном пути, используя ConcurrentHashMap
. Для каждой точки:
- Ознакомьтесь с методами
putIfAbsent
и replace
оба являются потокобезопасными и объединяют проверку текущего состояния hashmap и обновление его в одну атомную операцию.
- Метод get не синхронизируется внутри, но возвращает самое последнее значение для указанного ключа, доступного для него (проверьте ConcurrentHashMap класс Javadoc для обсуждения).
Преимущество ConcurrentHashMap
над чем-то вроде Collections.synchronizedMap
- это комбинированные методы, такие как putIfAbsent
, которые предоставляют традиционную карту get
и put
логически синхронно. Используйте эти методы и не пытайтесь предоставить свою собственную синхронизацию по ConcurrentHashMap
, поскольку она не будет работать. Коллекции java.util.concurrent
внутренне синхронизированы, а другие потоки не будут реагировать на попытки синхронизации объекта (например, synchronize(myConcurrentHashMap){}
не будет блокировать другие потоки).
Ответ 2
Боковое примечание:
Возможно, вам захочется взглянуть на реализацию хеш-таблицы без блокировки Cliff Click, ее часть библиотека с высокой масштабируемостью Java
(Здесь Google Talk от Клифф Нажмите об этом свободном хэше блокировки.)
Ответ 3
ConcurrentHashMap был разработан и внедрен во избежание любых проблем со сценариями, которые вы описываете. Вам не о чем беспокоиться.
Хеш-таблица, поддерживающая полный concurrency извлечения и регулируемый ожидаемый concurrency для updates.updates.
javadoc of ConcurrentHashMap