gpt4 book ai didi

Java Semaphore - 如何获得已使用的许可

转载 作者:行者123 更新时间:2023-11-30 08:14:31 25 4
gpt4 key购买 nike

我们可以通过 availablePermits() 获得剩余许可

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

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

最佳答案

不幸的是,如果您不自己跟踪原始号码,这是不可能的。或者,您可以轻松地扩展 Semaphore 以具有上述功能(底部的示例实现)。

理论上(以及在 Java 实现中),信号量没有任何“原始”许可数的概念。使用信号量的已定义语义,您可以很好地使用 0 个许可对其进行初始化,并要求在获得任何许可之前“释放”一些许可。在实践中,我从未见过以这种方式使用的信号量,但这就是信号量的定义方式。

来自 Java Semaphore documentation :

There is no requirement that a thread that releases a permit must have acquired that permit by calling acquire(). Correct usage of a semaphore is established by programming convention in the application.

如您所见,如果我们自己不知道“最大允许”,信号量的设计方式,它们也无法告诉我们。

如果您将信号量看作是 int 的包装器(它在很多方面都是如此),那么它就变得很清楚了:

假设我们有以下序列:

int permits = x;
permits--;
permits++;
// More unknown decrements/increments
permits--;

现在获得许可数量很容易。在不知道 x 或同时不知道操作顺序的情况下,告诉您已使用了多少是不可能的。


扩展 Semaphore 以具有 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();
}
}

关于Java Semaphore - 如何获得已使用的许可,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29452959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com