Подсчет количества активных запросов we без блокировки

#multithreading #concurrency

#многопоточность #параллелизм

Вопрос:

На веб-сервере Java я хотел бы знать, есть ли какие-либо активные веб-запросы.

Моя первая идея была чем-то вроде:

     public static AtomicInteger count = new AtomicInteger();

    public void processRequest() {
        count.incrementAndGet();
        // process my request
        count.decrementAndGet();
    }

    public boolean areThereActiveRequests() {
        return 0 == count.get();
    }
  

Очевидно, что это приводит к блокировке веб-запросов (хотя и быстро) друг против друга в ожидании блокировки count() при увеличении или уменьшении, чего мы не хотим для сервера с высокой масштабируемостью.

Обратите внимание, что могут возникнуть проблемы с синхронизацией с любыми вызовами кода, которые вызывает thereactiverequests — возвращаемое значение может устареть к моменту его возврата, но для моих целей это нормально.

Есть идеи?

Комментарии:

1. Это было бы лучше реализовать как промежуточное программное обеспечение. При входе счетчик увеличивается, при выходе уменьшается. Таким образом, вам не нужно привязывать код обработки запросов вашего приложения к этому коду мониторинга. Если быть точным, нет блокировки для count. Он использует CAS в цикле. en.wikipedia.org/wiki/Compare-and-swap

Ответ №1:

Ваши веб-запросы не будут блокироваться друг против друга в ожидании блокировки, поскольку AutomicInteger не требует никаких блокировок и использует примитив аппаратной синхронизации.

Проверьте это для получения подробной информации

Следовательно, ваш текущий код хорошо подходит для проблемы, которую вы пытаетесь решить.

Комментарии:

1. Примитивы аппаратной синхронизации не являются волшебными 🙂 Им все еще приходится иметь дело с конфликтом. В зависимости от архитектуры операции с атомной памятью могут блокировать шину памяти, ограничивая масштабируемость.

2. Согласен, но они намного лучше других механизмов блокировки.