gpt4 book ai didi

java - 使用 arraydeque 的生产者-消费者仅在断点处工作

转载 作者:行者123 更新时间:2023-12-01 12:04:35 26 4
gpt4 key购买 nike

我正在使用 ArrayDeque 实现生产者和消费者模式,但遇到了一个奇怪的问题。

Consumer.java
Class Consumer {
public final Queue<Msg> my_queue = new ArrayDeque<Msg>();

public void begin() {
new Thread() {
new Runnable() {
public void run() {
while(true) {
while(my_queue.isEmpty()) {
// do nothing
}

Msg msg = my_queue.remove();
msg.doSomething();
}
}
}
}.start();
}
}

由于 my_queue 是公共(public)的,因此我可能有 > 1 个线程执行 my_queue.add(msg)。然而,奇怪的事情发生了,因为在生产环境中运行时 doSomething 从未被调用。但是,当我处于 Debug模式并使用断点时,将调用 doSomething() !谁能解释一下吗?

最佳答案

ArrayDeque不是线程安全的。您必须使用锁(同步关键字或读/写锁)来保护它,以便从不同的线程安全地访问它。

另一种选择是使用线程安全的双端队列实现,最好是阻塞实现(例如 LinkedBlockingDeque ),这也可以让您避免忙于等待队列变为非空。

关于java - 使用 arraydeque 的生产者-消费者仅在断点处工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27718304/

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