Java 生产商-消费者解决方案的困惑(同步澄清)

Java 生产商-消费者解决方案的困惑(同步澄清),java,multithreading,concurrency,synchronized,producer-consumer,Java,Multithreading,Concurrency,Synchronized,Producer Consumer,我一直在学习Java中的并发性,遇到了生产者-消费者问题。这显然是标准的,我在很多地方看到了几乎相同的答案 public synchronized void put(int num){ while (!empty) { try{ wait(); } catch {} } buffer=num; empty=false; notify(); } public synchronized int tak

我一直在学习Java中的并发性,遇到了生产者-消费者问题。这显然是标准的,我在很多地方看到了几乎相同的答案

public synchronized void put(int num){
    while (!empty) {
        try{
            wait(); }
        catch {}
    }

    buffer=num;
    empty=false;
    notify();
}

public synchronized int take(){
    while (empty) {
        try{
            wait(); }
        catch {}
    }

    empty=true;
    notify();
    return buffer;
}
我对synchronized的理解是,它使用对象范围的锁,这意味着线程不能同时处于put和take中。但是,这两种方法都等待另一种方法。这就是我困惑的地方:这似乎造成了僵局。如果线程A在empty=false时进入put
,它将等待。但是,线程B无法输入take,因为它是同步的。因此,空虚将永远是虚假的,给人僵局

然而,考虑到我已经多次基本上看到了这个答案,它似乎一定是对的。我理解错了什么


谢谢大家!

调用
wait
将释放进入方法时获取的锁。因此,如果A输入了
put
并调用了
wait
,锁就会被释放,B就可以在
take
内继续

从:


好的,这肯定有助于澄清问题。但是,如果B在take中并调用notify(),则会唤醒A,但A没有它当前所在方法的锁(因为B在离开take之前还有一行)。那么A是返回睡眠状态还是在没有实际等待()的情况下等待?@Akroy,在我引用的文本之后还有一句话:“线程然后等待,直到它可以重新获得监视器的所有权并恢复执行。”我已将其添加到帖子中。现在你有了我希望的全部画面。我想是的,这变得更加清晰了!最后澄清:那么,如果在最初的情况下,A在等待,那么另一个制作人C也进来并在put内等待,这将如何工作?B会叫醒A和C吗?或者这是一个谁先响应的比赛条件?非常感谢你!不存在生产者和消费者都会等待的情况,因为您的队列容量只有1个项目(即,它要么是空的,要么是满的,不能同时发生)。但是如果我有两个生产者在等待,那么哪一个被唤醒会是不确定的吗?还是会产生一些问题?
The current thread must own this object's monitor. The thread releases ownership 
of this monitor and waits until another thread notifies threads waiting on this 
object's monitor to wake up either through a call to the notify method or the 
notifyAll method. The thread then waits until it can re-obtain ownership of the 
monitor and resumes execution.