gpt4 book ai didi

java - Java中的阻塞队列

转载 作者:行者123 更新时间:2023-12-01 14:39:29 25 4
gpt4 key购买 nike

我正在读一本名为“Beginning Algorithms”的书,其中有 Java 示例。在关于队列的章节中,它解释了“阻塞队列”,并且......即使我的背景是 C# 而不是 Java,有些东西对我来说看起来很有趣。

这是代码的一部分(我省略了不相关的部分):

public void enqueue(Object value){
synchronized(_mutex){
while(size == _max_size){
waitForNotification();
}
_queue.enqueue(value);
_mutex.notifyAll();
}
}

private void waitForNotification(){
try {
_mutex.wait();
} catch( InterruptedException e){
// Ignore
}
}

public Object dequeue() throws EmptyQueueException {
synchronized(_mutex){
while(isEmpty()){
waitForNotification();
}
Object value = _queue.dequeue();
_mutex.notifyAll();
return value;
}
}

我发现两个主要问题。

首先,如果队列已满,有5个线程正在等待添加项目,而其他线程出队1个项目,其他5个将被释放,同时会检查“size() == _max_size”是否不存在如果不再为 true,他们将尝试调用“_queue.enqueue”5 次,导致队列溢出。

其次,“出队”也会发生同样的情况。如果由于队列为空而导致多个线程在尝试使项目出列时被阻止,则添加一个线程将导致所有线程检查队列是否不再为空,并且所有线程都将尝试使项目出列,我猜会得到 null 或异常。

我说得对吗?我的 C# 有一个“Monitor.Pulse”,它只释放一个被阻塞的线程,这会是解决方案吗?

干杯。

最佳答案

您忽略了synchronized语句。这仅允许一个线程获取_mutex。因此,只有一个线程能够检查 size 的值,因为 while 语句位于 synchronized block 内。

this thread 中所述,wait() 方法实际上释放 _mutex 对象并等待对 notify()notifyAll()< 的调用 在这种情况下。此外,notifyAll() 只会将 _mutex 上的锁授予一个等待线程。

关于java - Java中的阻塞队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16125865/

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