Я пытаюсь использовать ConcurrentHashMap.compute для реализации чего-либо, и я не могу понять, если моя логика на 100% безопасна и правильна.Javadoc говорит о compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
методе:
Пытается вычислить сопоставление для указанного ключа и его текущего сопоставленного значения (или ноль, если текущего сопоставления нет).Весь вызов метода выполняется атомарно.Некоторые попытки обновления этой карты другими потоками могут быть заблокированы во время вычислений, поэтому вычисления должны быть короткими и простыми и не должны пытаться обновить какие-либо другие сопоставления этой карты.
Вопрос в том, могу ли я передать функцию, имеющую побочные эффекты, этому методу?Есть ли гарантия, что функция применяется только один раз, даже если другие потоки пытаются обновить тот же ключ?
LE: По запросу, это моя функция обновления (пытается сгенерировать событие и удалить кэшированныйобновления с карты):
final Set<UniqueID> updatedIds = new HashSet<>(updatesMap.keySet());
for (final ID id : updatedIds) {
updatesMap.compute(id, (modifiedId, updates) -> {
final Event event = createEvent(modifiedId, updates);
threadPool.addEvent(event);
return null;
});
}
Я должен быть уверен, что из каждого обновленного идентификатора создается только одно событие.