Я пишу приложение, которое возвратит HashMap пользователю. Пользователь получит ссылку на этот MAP. На бэкенде я буду выполнять некоторые потоки, которые обновят Карту.
Что я сделал до сих пор?
Я заставил все потоки бэкенда так совместно использовать общий канал для обновления MAP. Таким образом в бэкенде я уверен, что параллельная операция записи не будет проблемой.
Проблемы я имею
Непока теперь я не имею, сталкиваются с любой такой проблемой, но я боюсь, что могу столкнуться в будущем. Дайте sugesstions.
Я использую ConcurrentHashMap<String, String>.
Вы на правильном пути, используя ConcurrentHashMap
. Для каждой точки:
putIfAbsent
и replace
, оба являются потокобезопасными и объединяют проверку текущего состояния хэш-карты и его обновление в одну атомарную операцию. Преимущество ConcurrentHashMap
над чем-то вроде Collections.synchronizedMap
- это комбинированные методы, такие как putIfAbsent
, которые предоставляют традиционные Map get
и помещает логику
во внутреннюю синхронизацию.Используйте эти методы, и не пытайтесь обеспечить вашу собственную синхронизацию через ConcurrentHashMap
, так как это не сработает. Коллекции java.util.concurrent
внутренне синхронизированы, и другие потоки не будут отвечать на попытки синхронизации объекта (например, synchronize (myConcurrentHashMap) {}
не будет блокировать другие потоки).
Side Note:
Возможно, вам стоит обратить внимание на реализацию хэш-таблицы без блокировок от Клиффа Клика, это часть библиотеки Highly Scalable Java
(Вот Google Talk Клиффа Клика об этом хэше без блокировок)
.ConcurrentHashMap был разработан и реализован так, чтобы избежать каких-либо проблем с описанными вами сценариями. Тебе не о чем беспокоиться.
Хеш-таблица, поддерживающая полную параллелизм поиска и регулируемый ожидаемый параллелизм для обновления. обновления.