У меня много потоков, которые я реализую из 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--;
}




Если у вас много экземпляров класса, у которого есть метод
void addStock(StockState newStock)
Ваш счетчик не работает в отношении безопасности потоков, и его поведение не гарантируется. Потоки, использующие разные экземпляры класса, не будут блокировать друг друга. Чтобы исправить это, вы можете вместо этого синхронизировать сам экземпляр класса java.
synchronized(OuterClass.class)
Если вы используете блокировку только для счетчика, гораздо предпочтительнее использовать экземпляр
AtomicLong
Он не блокирует и работает лучше на порядок.
Сделать это можно двумя способами.
(1) Java AtomicInteger или AtomicLong:
Здесь вы можете использовать метод decrementAndGet() в обоих классах для достижения своей цели. Оба являются свободными от синхронизации (неблокирующими) операциями, достигаемыми с помощью алгоритмов Сравнить и поменять местами.
(2) Java Семафор:
Вы можете легко использовать этот, который специально разработан для ваших требований (управление # количеством потоков). Таким образом, вам не нужно изобретать вещи заново, а также наслаждаться неблокирующей природой (как в пункте 1). Вы можете использовать методы acquire() и release() для контроля подсчета.
Не нужно изобретать велосипед. Попробуйте Семафор