put(s)和take(s)在BlockingQueue Java中

时间:2014-02-04 00:54:06

标签: java multithreading concurrency queue blockingqueue

以下是示例。

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()动作,并且只有在那之后等待的线程才会返回?

谢谢。

1 个答案:

答案 0 :(得分:0)

一旦完成,锁定被释放现在让我们假设放置并且两者都在等待该锁定并且其不公平的锁定然后任何方法Put / Take可以获得锁定并启动。 除非另有说明,否则没有有序和备用的监视器(锁定)交换。

通过java查看代码。

ArrayBlockingQueue

ReentrantLock

AbstractQueuedSynchronizer