2015-03-02 80 views
2

我经历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()方法中,通知被调用,这将使其他线程进入该部分。不应该在take方法中等待。请帮助我理解。

感谢

Jayendra

+0

为什么? JDK已经包含了一个。 – 2015-03-02 10:27:21

回答

3

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

不要你 “吃” 和 “释放” 逆转吗?

和笔者承认

你是对的,也许应该已经逆转。

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

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

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

至于学习工作是如何工作的,首先将JDK源代码作为第一步,可能会有一定的挑战性(但在您达成初步理解后仍有很好的阅读能力)。最好找到更好的文章。

1

使用java.util.concurrent.Semaphore

计数信号量。从概念上讲,信号量维护一套许可证。如果需要,每个获取()都会阻止,直到获得许可证为止,然后将其获取。每个版本()都添加一个许可证,可能会释放一个阻止的收单机构。但是,没有使用实际的许可证对象;信号量只是保持可用数量的计数,并据此采取行动。

Grep the code.

+1

这就是人们会做的,同意。但它没有回答这个问题。 – Thilo 2015-03-02 10:26:54

+0

我知道它在jdk中,但我正在实现一个用于知识目的。请帮助我理解它。 – 2015-03-02 10:31:16

+0

阅读源代码。 – 2015-03-02 10:31:46

0

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

如果你调用调用,即通过调用'release'来锁定,信号量将工作,但不会计数。

相关问题