我正在http://tutorials.jenkov.com/java-concurrency/semaphores.html
阅读本教程计算信号量的实现是:
public class CountingSemaphore {
private int signals = 0;
public synchronized void take() {
this.signals++;
this.notify();
}
public synchronized void release() throws InterruptedException{
while(this.signals == 0) wait();
this.signals--;
}
}
代码对我来说很奇怪,因为根据我的理解,信号量记录了可用资源的数量,因此我们应该在take()
时减少计数,并在release()
时增加计数(和当然从限制开始)。
任何人都可以让我更深入地了解计算和倒计时方法之间的区别吗?
答案 0 :(得分:1)
在这里,似乎很清楚两个方法的代码已被交换,应该是
public class CountingSemaphore {
private int signals = 0;
public synchronized void take() throws InterruptedException {
while(this.signals == 0) wait();
this.signals--;
}
public synchronized void release() {
this.signals++;
this.notify();
}
}
实际上,阻止方法是take
而不是release
,可以被调用任意次。
更一般地说,向上计算似乎很自然,但理论上也可以做到完全相反。不确定它是否有用(和可读)!