Счетчик запросов к методам по потокам

У меня много потоков, которые я реализую из main. Моя цель - ограничить запросы к серверу (некоторые методы в классе sever), Поэтому я ставлю счетчик перед критическими секциями и перед синхронизацией. Заметил, что счетчик только растет и никогда не убывает ... Это образец моего кода:

private static int currentRequests;
/**
 * @param newStock StockState we are adding to the exist stock states.
 */
public  void addStock(StockState newStock) throws OutOfBoundConcurrentException
{
    if (currentRequests>MaxConcurrentRequests)
        throw new OutOfBoundConcurrentException();          
    System.out.println(currentRequests++);
    synchronized (this) {
    int indx=checkExistStock(newStock.getStockName());          
    if (indx<0)
    {
        stockStates.add(newStock);
        currentRequests--;
        return;
    }
    else
    {
        stockStates.get(indx).updateStockValueFromStockStateClass(newStock.getStockCurrentValue());
    }
    }
    currentRequests--;
}   

Не нужно изобретать велосипед. Попробуйте Семафор

jingx 04.06.2018 21:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
56
2

Ответы 2

Если у вас много экземпляров класса, у которого есть метод

void addStock(StockState newStock)

Ваш счетчик не работает в отношении безопасности потоков, и его поведение не гарантируется. Потоки, использующие разные экземпляры класса, не будут блокировать друг друга. Чтобы исправить это, вы можете вместо этого синхронизировать сам экземпляр класса java.

synchronized(OuterClass.class)

Если вы используете блокировку только для счетчика, гораздо предпочтительнее использовать экземпляр

AtomicLong

Он не блокирует и работает лучше на порядок.

Сделать это можно двумя способами.

(1) Java AtomicInteger или AtomicLong:

Здесь вы можете использовать метод decrementAndGet() в обоих классах для достижения своей цели. Оба являются свободными от синхронизации (неблокирующими) операциями, достигаемыми с помощью алгоритмов Сравнить и поменять местами.

(2) Java Семафор:

Вы можете легко использовать этот, который специально разработан для ваших требований (управление # количеством потоков). Таким образом, вам не нужно изобретать вещи заново, а также наслаждаться неблокирующей природой (как в пункте 1). Вы можете использовать методы acquire() и release() для контроля подсчета.

Другие вопросы по теме