0

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

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--;
}   
4

2 回答 2

1

如果您有许多具有该方法的类的实例

void addStock(StockState newStock)

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

synchronized(OuterClass.class)

如果您仅将锁用于计数器,则更倾向于使用

AtomicLong

它是非阻塞的,并且性能要好一个数量级。

于 2018-06-04T19:43:06.060 回答
0

您可以通过 2 种方式进行操作。

(1) Java AtomicIntegerAtomicLong

在这里,您可以decrementAndGet()在两个类中使用方法来实现您的目标。两者都是无同步(非阻塞)操作,通过使用比较和交换算法实现。

(2) Java信号量

你可以很容易地使用这个,它是专门为你的需求需求定制的(控制#no of threads)。这样,您无需重新发明事物,也可以享受非阻塞性(与#1相同)。您可以使用acquire()release()方法来控制计数。

于 2018-06-05T07:00:58.263 回答