这是例子。
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