#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. Согласен, но они намного лучше других механизмов блокировки.