java - Java BlockingQueue 中的 put(s) 和 take(s)

标签 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());
        }
    }
}

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

谢谢。

最佳答案

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

查看java代码。

ArrayBlockingQueue

ReentrantLock

AbstractQueuedSynchronizer

关于java - Java BlockingQueue 中的 put(s) 和 take(s),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21540974/

相关文章:

java - 将包含德语字符的 ANSI 文件转换为 UTF8

java - 防止数组列表中出现重复项

java - 从调用线程运行 CompletableFuture.thenAccept ?

c++ - 使用 c++11 线程返回结果的正确方法是什么?

java - 这是最小化绑定(bind)失效的有效方法吗?

c# - "late-bound access to the destination object"是什么意思?

java - 我想我迭代 key(itr) 的方式错误?

c# - 为什么 "abcd".StartsWith ("") 返回真?

java - 服务器创建的实例什么时候死?

multithreading - 这是双重检查锁定的安全版本吗?