线程请求方法的计数器

时间:2018-06-04 19:27:21

标签: java multithreading concurrency hitcounter

我有很多线程,我从main实现。 我的目的是限制对服务器的请求(服务器类中的一些方法), 所以我在关键部分和同步之前放置了计数器。 我注意到,柜台只会长大,永不减少...... 那是我的代码示例:

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 :(得分:1)

如果您有许多具有方法

的类的实例
void addStock(StockState newStock)

您的计数器在线程安全方面被打破,并且无法保证计数器的行为。 使用该类的不同实例的线程不会相互阻塞。 要修复它,您可以改为同步java类实例。

synchronized(OuterClass.class)

如果您仅对计数器使用锁定,则最好使用

的实例
AtomicLong

它是非阻塞的,并且在数量级上表现更好。

答案 1 :(得分:0)

你可以通过两种方式完成。

(1)Java AtomicIntegerAtomicLong

您可以在这两个类中使用decrementAndGet()方法来实现目标。两者都是无同步(非阻塞)操作,通过使用Compare And Swap算法实现。

(2)Java Semaphore

您可以轻松使用这个,专门针对您的需求要求而定制( 控制线程的#no )。通过这种方式,您不需要重新发明事物,也可以享受非阻塞性质(与#1相同)。您可以使用acquire()release()方法来控制计数。