为什么在这段代码中,信号量计数而不是下降?

时间:2014-10-02 16:48:41

标签: java synchronization locking mutex semaphore

我正在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()时增加计数(和当然从限制开始)。

任何人都可以让我更深入地了解计算和倒计时方法之间的区别吗?

1 个答案:

答案 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,可以被调用任意次。

更一般地说,向上计算似乎很自然,但理论上也可以做到完全相反。不确定它是否有用(和可读)!