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