Счетчик запросов к методам по потокам - PullRequest
0 голосов
/ 04 июня 2018

У меня много тем, которые я реализую с основного.Моя цель - ограничить запросы к серверу (некоторые методы в классе 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--;
}   

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

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

(1) Java AtomicInteger или AtomicLong :

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

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

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

0 голосов
/ 04 июня 2018

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

void addStock(StockState newStock)

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

synchronized(OuterClass.class)

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

AtomicLong

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

...