0

我正在使用 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 是公开的,我可能有 > 1 个线程执行 my_queue.add(msg)。然而,奇怪的发生是因为 doSomething 在生产中运行时从未被调用。但是,当我处于调试模式并使用断点时,将调用 doSomething()!谁能解释一下?

4

1 回答 1

1

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

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

于 2014-12-31T08:36:32.470 回答