这是例子。

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() Action 之后是否发生take() Action ,或者两个put() Action 可能一个接一个地发生,并且只有在等待线程返回之后才发生?

谢谢你。

最佳答案

放置完成后,立即释放锁定,让我们假设放置和获取都再次在该锁定及其不公平的锁定上等待,然后Put/Take的任何方法都可以锁定并启动。
除非指定,否则不进行有序且备用的监视器(锁)交换。

请参阅Java代码。

ArrayBlockingQueue

ReentrantLock

AbstractQueuedSynchronizer

09-04 23:30