java.util.concurrent.LinkedBlockingQueue的简要描述说它是一个FIFO队列,这意味着如果线程A首先将一堆条目(a1,a2,...an)添加到队列中,然后线程B再添加一些东西进入队列(b1,b2,... bm),然后一些消费者线程应该在从 B 获取这些条目之前耗尽 A 中的所有条目(因此是 FIFO)。但我所看到的是,来自 A 的条目和来自 B 的条目是交错的,即使 B 添加其条目的时间比 A 晚得多。我正在对一些 Tomcat + Jersey 应用程序进行代码审查,它使用单例LinkedBlockingQueue
加上少数异步工作线程来处理来自客户端的请求条目。
我质疑代码的公平性,因为迟到的请求必须在队列中等待,直到早期的条目全部用完(客户端可以为每个请求提交数千个条目),但令我惊讶的是,迟到的客户得到了他们的回应几乎立即回来。那么这是否意味着LinkedBlockingQueue
不是FIFO?请帮忙,因为我很困惑。