我正在浏览这个链接,这里给出了协同信号量的实现:
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"来锁定,则信号量将起作用,但不起作用。