我们可以通过availablePermits()
如何在运行时获取usedPermits()
或maxPermits
(例如,从db加载最大许可,并且在创建信号量后db值可能会发生变化)?
当然我可以记住内存中的最大许可证,但我想知道是否有一种简单的方法可以做到这一点
答案 0 :(得分:2)
不幸的是,如果您不自己跟踪原始号码,那是不可能的。或者,您可以轻松地扩展Semaphore以具备所述功能(示例实现在底部)。
理论上(以及Java实现中),信号量没有任何"原始"的概念。许可数量。使用信号量定义的语义,你可以用0许可证很好地初始化它,并且需要一些许可证才能被释放出来#34;在任何可以获得之前。在实践中,我从未见过以这种方式使用的信号量,但这就是信号量的定义方式。
来自Java Semaphore documentation:
不要求释放许可证的线程必须通过调用acquire()获取该许可证。通过应用程序中的编程约定来建立信号量的正确使用。
正如你所看到的,如果我们不知道" max许可"我们自己,信号量的设计方式,他们也无法告诉我们。
如果你认为信号量是一个int的包装器(它在很多方面都是这样),那就很清楚了:
想象一下,我们有以下顺序:
int permits = x;
permits--;
permits++;
// More unknown decrements/increments
permits--;
现在获取许可数量很容易。在没有知道x
或同时操作序列的情况下告诉你已经使用了多少是不可能的。
将信号量扩展为usedPermits
方法的示例。
import java.util.concurrent.*;
class UsedTrackingSemaphore extends Semaphore {
private int originalPermits;
public UsedTrackingSemaphore(int permits) {
super(permits);
originalPermits = permits;
}
public UsedTrackingSemaphore(int permits, boolean fair) {
super(permits, fair);
originalPermits = permits;
}
public int usedPermits() {
return originalPermits - availablePermits();
}
}