编程语言
首页 > 编程语言> > java-对生产者-消费者解决方案感到困惑(同步说明)

java-对生产者-消费者解决方案感到困惑(同步说明)

作者:互联网

我一直在学习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;
}

我对同步的理解是,它使用了对象范围的锁,这意味着线程不能同时放入和取出.但是,这两种方法都在等待另一种方法.这就是我感到困惑的地方:这似乎会造成死锁.如果在empty = false时线程A被放入,它将等待.但是,线程B无法同步输入,因为它已同步.因此,空将永远是假的,从而导致死锁.

考虑到我已经基本看过这个答案多少次了,看来它一定是正确的.我理解错了什么?

谢谢!

解决方法:

调用wait将释放进入方法时获得的锁.因此,如果A进入推杆并称为“等待”,则锁定被释放,然后B可以继续进行接球.

javadoc

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. 

标签:producer-consumer,multithreading,concurrency,synchronized,java
来源: https://codeday.me/bug/20191101/1987294.html