如何实现信号量

时间:2015-03-02 10:23:13

标签: java semaphore

我正在浏览this链接,此处coiunting信号量的实现如下:

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()方法中,调用notify,这将使其他线程进入section.Shouldnt里面有等待take方法。请帮我理解。

谢谢

Jayendra

3 个答案:

答案 0 :(得分:3)

该文章的第一条评论指出:

  

你没有“接受”和“释放”逆转吗?

并且作者承认

  

你是对的,应该可以逆转。

所以,是的,it seems the article got things mixed up a bit

如果您只是切换这两种方法,它可能会有效。

然而,在现实生活中,JDK现在在concurrency utils包中有信号量,你应该使用它们。

至于学习如何工作,看看JDK源作为第一步可能有点挑战(但是在你初步了解之后阅读非常好)。最好找一篇更好的文章。

答案 1 :(得分:1)

使用java.util.concurrent.Semaphore

  

计数信号量。从概念上讲,信号量保持一组许可。如果需要,每个acquire()都会阻止,直到有许可证可用,然后接受它。每个版本()都会添加一个许可证,可能会释放一个阻塞收单器。但是,没有使用实际的许可对象;信号量只保留可用数量并相应地采取行动。

Grep the code.

答案 2 :(得分:0)

方法名称由翻译错误切换,请参阅原作者的评论。代码在这种形式中没有意义,因为它会产生死锁:释放只会减少计数器,如果它为零,这将永远不会再发生!

如果你交换了电话,即通过调用'release'来锁定,信号量将起作用,但不计算。