我有很多线程,我从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--;
}
答案 0 :(得分:1)
如果您有许多具有方法
的类的实例void addStock(StockState newStock)
您的计数器在线程安全方面被打破,并且无法保证计数器的行为。 使用该类的不同实例的线程不会相互阻塞。 要修复它,您可以改为同步java类实例。
synchronized(OuterClass.class)
如果您仅对计数器使用锁定,则最好使用
的实例AtomicLong
它是非阻塞的,并且在数量级上表现更好。
答案 1 :(得分:0)
你可以通过两种方式完成。
(1)Java AtomicInteger或AtomicLong:
您可以在这两个类中使用decrementAndGet()
方法来实现目标。两者都是无同步(非阻塞)操作,通过使用Compare And Swap算法实现。
(2)Java Semaphore:
您可以轻松使用这个,专门针对您的需求要求而定制( 控制线程的#no )。通过这种方式,您不需要重新发明事物,也可以享受非阻塞性质(与#1相同)。您可以使用acquire()
和release()
方法来控制计数。