Java Semaphore - 如何使用许可证

时间:2015-04-05 00:45:03

标签: java semaphore

我们可以通过availablePermits()

获得遗留许可

如何在运行时获取usedPermits()maxPermits(例如,从db加载最大许可,并且在创建信号量后db值可能会发生变化)?

当然我可以记住内存中的最大许可证,但我想知道是否有一种简单的方法可以做到这一点

1 个答案:

答案 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();
    }
}