如何实现信号量



我正在浏览这个链接,这里给出了协同信号量的实现:

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,这将使其他线程进入该部分。不应该有等待内部采取的方法。请帮我理解。

感谢

Jayendra

这篇文章的第一条评论指出:

你不是把"接受"one_answers"释放"颠倒过来了吗?

作者承认

你是对的,这可能应该被逆转。

所以,是的,这篇文章似乎把事情搞混了。

如果你只是切换这两种方法,它可能会起作用。

然而,在现实生活中,JDK现在在并发utils包中有信号量,您应该使用这些信号量。

至于学习事物是如何工作的,将JDK源代码作为第一步可能有点挑战性(但在您达到初步理解后阅读非常好)。最好找一篇更好的文章。

使用java.util.concurrent.Semaphore

计数信号灯。从概念上讲,信号量维护一组许可。如果需要,每个Acquired()都会阻止,直到有许可证可用,然后再获取。每个release()都添加了一个许可证,可能会释放一个阻止的Acquired。然而,没有使用实际的许可对象;信号量只是保持对可用数字的计数并相应地进行操作。

润滑代码。

方法名称因翻译错误而切换,请参阅原作者的评论。这种形式的代码毫无意义,因为它会产生死锁:只有当计数器为零时,释放才会减少计数器,这种情况再也不会发生了!

如果交换调用,即通过调用"release"来锁定,则信号量将起作用,但不起作用。

最新更新