【问题标题】:put(s) and take(s) in BlockingQueue JavaBlockingQueue Java 中的 put(s) 和 take(s)
【发布时间】:2014-02-04 00:54:06
【问题描述】:

这是一个例子。

class Factory {
    Queue<Object> queue = new LinkedBlockingQueue<Object>();

    public Object consume() {
        queue.take();
    }

    public void produce() {
        for (int i = 0; i < 2; i++) {
            queue.put(new Object());
        }
    }
}

例如,我有两个线程,它们都调用了 consume()。他们正在等待生产者将某些东西放入队列中。我的问题是在 put() 动作之后是否会发生 take() 动作,或者两个 put() 动作是否可能一个接一个地发生,并且只有在等待线程返回之后?

谢谢。

【问题讨论】:

  • BlockingQueue 是一个interface。任何状况之下;当涉及到线程时,不要假设任何顺序。 take() 很可能会在 put() 之后发生 - 但可能会发生由 put() 唤醒的胎面可能会被另一个 put() 击败。

标签: java multithreading concurrency queue blockingqueue


【解决方案1】:

一旦 put 完成,锁就会被释放,现在让我们假设 put 和 take 都在再次等待该锁并且它的不公平锁,那么 Put/Take 的任何方法都可以获取锁并开始。 除非指定,否则没有有序和交替的监视器(锁)交换。

查看java代码。

ArrayBlockingQueue

ReentrantLock

AbstractQueuedSynchronizer

【讨论】:

    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 2014-02-14
    • 2014-09-26
    • 1970-01-01
    • 2015-04-27
    • 2011-12-28
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多