Я хотел бы создать класс параллельного счетчика частоты в Java.
Речь идет о том, что после обработки запроса (методом processRequest) код проверяет тип запроса (целое число) и подсчитывает, сколькозапросы были обработаны (сгруппированы по типу запроса) с заданного времени.Метод processRequest будет вызываться несколькими потоками одновременно.
Есть два других метода:
- clearMap (): он будет вызываться одним потоком каждые 3 часаи очищает всю карту.
- getMap (): он может быть вызван в любое время веб-службой и возвращает неизменную копию текущего состояния карты частот.
См.ниже моего первоначального плана по реализации этого.
public class FrequencyCounter {
private final ConcurrentHashMap<Integer,Long> frequencenyMap = new ConcurrentHashMap<>();
public void processRequest(Request request){
frequencenyMap.merge(request.type, 0L, (v, d) -> v+1);
}
public void clearMap(){
frequencenyMap.clear();
}
public Map<Integer,Long> getMap(){
return ImmutableMap.copyOf(frequencenyMap);
}
}
Я проверил документацию ConcurrentHashMap и он сообщает, что метод слияния выполняется атомарно.
Так что, как только метод clear () начинает очищатьсяхэш-сегменты карты (блокировка в соответствии с хэш-сегментом), его нельзя вызвать, когда другой поток находится между получением значения карты частот и увеличением его значения в методе processRequest, поскольку метод слияния выполняется атомарно.
Я прав?Мой план выше, кажется, в порядке?
Спасибо за ваш совет.