gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:24:02 25 4
gpt4 key购买 nike

我一直在学习 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 进入 put while empty=false,它将等待。然而,线程 B 不能进入 take,因为它是同步的。因此 empty 永远是 false,造成死锁。

不过,考虑到我基本上已经看过多少次这个答案,它似乎一定是正确的。我哪里理解错了?

谢谢!

最佳答案

调用wait 将释放进入方法时获得的锁。因此,如果 A 输入 put 并调用 wait,锁将被释放,然后 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.

关于java - 对生产者消费者解决方案感到困惑(同步说明),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8467235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com