我一直在学习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的理解是它使用了一个对象范围的锁,意味着线程不能同时放入和取出。 但是,两种方法都在等待另一种方法。 这是我困惑的地方:这似乎造成了僵局。 如果线程A进入put while empty=false ,它将等待。 但是,线程B无法进入take,因为它是同步的。 因此空虚将永远是虚假的,给予僵局。

然而,鉴于我基本上看到了这个答案的次数,它似乎一定是正确的。 我理解错了什么?

谢谢!

===============>>#1 票数:4 已采纳

调用wait将释放进入方法时获取的锁。 因此,如果输入putwait ,锁被释放,则B可以进行内take

来自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. 

  ask by akroy translate from so

未解决问题?本站智能推荐:

1回复

消费者生产者问题-总是需要同步吗?

我的问题纯粹是概念性的。 只是为了更深入地了解线程之间的通信。 在生产者消费者问题中, 有一个生产者线程和一个消费者线程。 生产者线程调用方法produce,而消费者线程调用方法消耗。 示例代码从这里获取 我已经阅读了wait和notify应该在同步块内
1回复

我的java(生产者-消费者)代码有什么问题?

我用synchronized和busy waiting编写了此Java代码,但我不知道为什么它无法正常工作! 例如我得到这个输出 如何产生6和7但消耗0? 我不知道这是怎么回事,请帮助我,这是我的代码: 有什么建议吗?
1回复

如何编写Java多线程代码以替代生产者和消费者方法。 它应该有3个生产者(P1,P2,P3)和1个消费者(C1)

我可以采用一种确定的方法来实现这一目标。 我使用了join,并等待其他生产者和消费者执行。 在采访中问了这个问题。 他不喜欢我的解决方案。 我还建议在同步块中使用一个循环来消耗/生产资源。 以下是预期的输出: p1 c1 p3 c1 p2 c1 p2 c1 。 。 。
2回复

安全出版物生产者消费者方案

我试图为一个生产者很多消费者的情况找到最快的解决方案,并提供无锁解决方案。 我假设当只与一个生产者打交道时,两者之间的价值可能会丢失,我们只需要关心安全的发布即可。 我提出了以下解决方案概念: 该想法基于Java Concurrency in Practice中的声明 有效的不
5回复

了解同步的用法

我正在尝试了解同步块的用法。 在下面的程序中,在Produce和Consumer方法内部,我创建了一个同步块,如果我使用lock1(object)锁定了它。 我收到以下错误,这是为什么,为什么我收到此错误? 我知道通过用这个(相同的类)替换lock1。 我可以摆脱错误。 我仍然
3回复

使用java同步了解Producer-Consumer

我一直在研究PC问题,以了解Java同步和线程间通信。 使用底部的代码,输出是 但不应该输出如下所示 我期望这样的输出,因为我的理解是,当方法终止时,只要generate方法释放锁,就会通知消费者产生的值。 结果是等待的用户块,进入同步状态获取锁消耗产生的值,同时生产者方法被
1回复

为什么要在单线程方法中放置一个同步块?

我在IBM-developerworks上偶然发现了这篇文章 ,他们发布的代码使我提出了一些问题: 为什么将局部变量Map的构建包装在synchronized块中? 请注意,他们隐式地说只有一个producer线程。 实际上,为什么此代码段根本需要一个synchronized
2回复

Java中的生产者/消费者 - 生产者阻止我的消费者

通常,现有的主题可以帮助我解决问题,但现在我发现自己陷入困境。 我想在Java中使用并发来实现Prod / Cons。 不使用现有API,因为它是出于学习目的。 我的生产者阻止消费者使用队列中的消息(Holder),但我希望Producer和Consumers同时使用队列。
3回复

实施生产者消费者模式

我正在尝试编写一个将邮件放入队列中的邮件实用程序,以后它会被使用者线程使用。 我正在尝试实现典型的生产者-消费者模式,但是出了点问题。 我只是写了一个骨架,并且骨架没有按预期工作。 MailProducer.java MailConsumer.java 最后是执
3回复

生产者消费者 - 使用Executors.newFixedThreadPool

我对生产者 - 消费者模式的理解是,它可以使用生产者和消费者之间共享的队列来实现。 生产者将工作提交给共享队列,消费者检索它并处理它。 它也可以由生产者直接提交给消费者来实现(生产者线程直接提交给Consumer的执行者服务)。 现在,我一直在查看Executors类,它提供了一些线程