我正在浏览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
答案 0 :(得分:3)
该文章的第一条评论指出:
你没有“接受”和“释放”逆转吗?
并且作者承认
你是对的,应该可以逆转。
所以,是的,it seems the article got things mixed up a bit。
如果您只是切换这两种方法,它可能会有效。
然而,在现实生活中,JDK现在在concurrency utils包中有信号量,你应该使用它们。
至于学习如何工作,看看JDK源作为第一步可能有点挑战(但是在你初步了解之后阅读非常好)。最好找一篇更好的文章。
答案 1 :(得分:1)
使用java.util.concurrent.Semaphore
。
计数信号量。从概念上讲,信号量保持一组许可。如果需要,每个acquire()都会阻止,直到有许可证可用,然后接受它。每个版本()都会添加一个许可证,可能会释放一个阻塞收单器。但是,没有使用实际的许可对象;信号量只保留可用数量并相应地采取行动。
答案 2 :(得分:0)
方法名称由翻译错误切换,请参阅原作者的评论。代码在这种形式中没有意义,因为它会产生死锁:释放只会减少计数器,如果它为零,这将永远不会再发生!
如果你交换了电话,即通过调用'release'来锁定,信号量将起作用,但不计算。