gpt4 book ai didi

java - 具有多个监视器的 BlockingQueue 设计

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:53:56 24 4
gpt4 key购买 nike

我正在编写一个 BlockingQueue 并且想知道其他实现如何解决这个问题:

如果我只有一个监视器(队列对象)并让生产者和消费者wait,我将必须确保 notifyAll 而不是 notify 被调用,否则即使队列已满,生产者也可能只向另一个等待的生产者发出信号以继续。让消费者等待,即使东西可用。另一方面,调用 notifyAll 似乎不是许多线程和处理器的可扩展解决方案。

BlockingQueue 是否使用两个监视器?一种是生产者等待,一种是消费者等待?然后我将不得不以封装的方式同步队列和相关监视器。这是要走的路吗?

最佳答案

我不确定它是如何在 BlockingQueue 中完成的,但一种可能的解决方案是使用 ReentrantLock而不是 synchronized

它与syncrhonized 具有相同的语义,但提供了一些改进。特别是,它可以有几个其他线程可以等待的条件:

public class MyBlockingQueue<E> {
private Lock lock = new ReentrantLock();
private Condition notEmpty = lock.newCondition();
private Condition notFull = lock.newCondition();

public void put(E e) {
lock.lock();
try {
while (isFull()) notFull.await();
boolean wasEmpty = isEmpty();
...
if (wasEmpty) notEmpty.signal();
} finally {
lock.unlock();
}
}

public E take() {
lock.lock();
try {
while (isEmpty()) notEmpty.await();
boolean wasFull = isFull();
...
if (wasFull) notFull.signal();
...
} finally {
lock.unlock();
}
}
...
}

关于java - 具有多个监视器的 BlockingQueue 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7938611/

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