java.util.concurrent.LinkedBlockingQueue 不是 FIFO 吗?

标签 java fifo java.util.concurrent blockingqueue

java.util.concurrent.LinkedBlockingQueue的简要说明说它是一个 FIFO 队列,这意味着如果线程 A 首先将一堆条目 (a1, a2, ... an) 添加到队列中,然后线程 B 将更多内容添加到队列中 (b1, b2, ... bm),那么一些消费者线程应该先耗尽 A 中的所有条目,然后再从 B 中获取这些条目(因此是 FIFO)。但我看到的是,来自 A 的条目和来自 B 的条目是交错的,即使 B 添加其条目的时间比 A 晚得多。我正在对一些 Tomcat + Jersey 应用程序进行代码审查,它使用单例 LinkedBlockingQueue 加上一些异步工作线程来处理来自客户端的请求条目。

我质疑代码的公平性,因为迟到的请求必须在队列中等待,直到较早的条目全部耗尽(客户端每个请求可以提交数千个条目),但令我惊讶的是,迟到的客户端几乎立即得到了他们的回复。那么这是否意味着 LinkedBlockingQueue 不是 FIFO?请帮助我,我很困惑。

最佳答案

队列是先进先出的,线程从队列中移除对象的顺序也是先进先出。一旦线程获得对象并开始运行方法,FIFO 顺序就会丢失。

如何判断“A 中的条目和 B 中的条目是交错的”?

关于java.util.concurrent.LinkedBlockingQueue 不是 FIFO 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12521684/

相关文章:

java - ThreadPoolTask​​Executor 关闭/重新运行问题

java - 如何实现多消费者多队列的消费者-生产者

java - 从按钮数组中获取文本

c - 使用 select() 和 O_NONBLOCK 从 FIFO 读取两个连续写入

java - 如何在 Java 中实现 SSL 代理服务器以克服浏览器中的证书错误?

c - 在一个程序中混合使用 SCHED_FIFO 和 SCHED_RR?

c - Fifo开口问题C

java - 使用java模拟并发更新计数

java - 最终变量赋值错误

java - 使用 XSLT 从 XML 生成 EXCEL