Я хотел бы собрать некоторые метрики из разных мест в веб-приложении. Для простоты все они будут счетчиками, и поэтому единственной операцией модификатора является увеличение их на 1.
Приращения будут параллельными и частыми. Чтение (сброс статистики) - редкая операция.
Я думал использовать ConcurrentHashMap . Вопрос в том, как увеличить счетчики правильно. Поскольку на карте нет операции «увеличения», мне нужно сначала прочитать текущее значение, увеличить его, а затем поместить новое значение на карту. Без дополнительного кода это не атомарная операция.
Возможно ли достичь этого без синхронизации (что противоречило бы цели ConcurrentHashMap )? Нужно ли смотреть на Гуава ?
Спасибо за любые указатели.
приписка
Есть связанный вопрос по SO ( Самый эффективный способ увеличить значение Map в Java ), но он сосредоточен на производительности, а не на многопоточности
UPDATE
Для тех, кто прибывает сюда через поиск по той же теме: помимо ответов ниже, есть полезная презентация , которая случайно затрагивает ту же тему. Смотрите слайды 24-33.