java.util.concurrent.LinkedBlockingQueue不是FIFO?

java.util.concurrent.LinkedBlockingQueue不是FIFO?,java,fifo,java.util.concurrent,blockingqueue,Java,Fifo,Java.util.concurrent,Blockingqueue,对的简要描述表明它是一个FIFO队列,这意味着如果线程a首先向队列中添加一组条目(a1、a2、…an),然后线程B向队列中添加更多的内容(b1、b2、…bm),那么一些使用者线程应该在从B接收这些条目之前耗尽a中的所有条目(因此FIFO)。但我所看到的是,来自A的条目和来自B的条目是交错的,即使B添加条目的时间比A晚得多。我在某个Tomcat+Jersey应用程序的代码审查中,它使用一个singletonLinkedBlockingQueue加上一些异步工作线程来处理来自客户端的请求条目 我对代

对的简要描述表明它是一个FIFO队列,这意味着如果线程a首先向队列中添加一组条目(a1、a2、…an),然后线程B向队列中添加更多的内容(b1、b2、…bm),那么一些使用者线程应该在从B接收这些条目之前耗尽a中的所有条目(因此FIFO)。但我所看到的是,来自A的条目和来自B的条目是交错的,即使B添加条目的时间比A晚得多。我在某个Tomcat+Jersey应用程序的代码审查中,它使用一个singleton
LinkedBlockingQueue
加上一些异步工作线程来处理来自客户端的请求条目


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

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


您如何判断“来自A的条目和来自B的条目是交错的”

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


您如何判断“来自A的条目和来自B的条目是交错的”

我从未观察过你描述的行为。你能提供一个可重复的例子吗?总是考虑提供视觉例子来支持你的假设。结果是从客户端看到的幻觉。请看我在回答中的评论。我从未观察过你描述的行为。你能提供一个可重复的例子吗?总是考虑提供视觉例子来支持你的假设。结果是从客户端看到的幻觉。请参见我在答案中的评论。另外,您如何确保B添加其条目“远晚于”A?@LouisWasserman-在测试中,这相当简单-让B等待()直到A将其所有对象排队,然后通知()B。监视线程如何从队列中移除对象至少“非常困难”。不能只在printf调用的负载中执行lob,printf有自己的锁,因此会修改您试图监视的操作。任何线程阻塞都会导致另一个工作线程运行,获取一个对象,然后也可能阻塞。如果有比内核多得多的工作线程(可能在网络应用程序中),那么对象将全部溢出到线程中。我同意设置它相当容易,但我想知道OP的代码中有什么让他确信——这似乎也是对所报告行为的合理解释。@LouisWasserman-是的,也许。。。了解这些系统中到底发生了什么是海森堡/观察家的事情之一——你不可能在不影响系统的情况下发现,谢谢大家。事实证明,这是客户端的错觉。LinkedBlockingQueue实际上是FIFO。请求看起来是交错的,这是因为后端请求处理程序处理队列中的请求的速度非常快,但将它们发送回客户端的速度要慢几个数量级。当第二个客户机发送其请求时,队列已经为空,因此其请求也会立即得到处理,然后两个客户机以较慢的速度接收结果。很抱歉。另外,你怎么能确定B添加其条目“比”A晚得多?@LouisWasserman-在测试中,这相当容易-让B等待()直到A将其所有对象排队,然后通知()B。监视线程如何从队列中移除对象至少“非常困难”。不能只在printf调用的负载中执行lob,printf有自己的锁,因此会修改您试图监视的操作。任何线程阻塞都会导致另一个工作线程运行,获取一个对象,然后也可能阻塞。如果有比内核多得多的工作线程(可能在网络应用程序中),那么对象将全部溢出到线程中。我同意设置它相当容易,但我想知道OP的代码中有什么让他确信——这似乎也是对所报告行为的合理解释。@LouisWasserman-是的,也许。。。了解这些系统中到底发生了什么是海森堡/观察家的事情之一——你不可能在不影响系统的情况下发现,谢谢大家。事实证明,这是客户端的错觉。LinkedBlockingQueue实际上是FIFO。请求看起来是交错的,这是因为后端请求处理程序处理队列中的请求的速度非常快,但将它们发送回客户端的速度要慢几个数量级。当第二个客户机发送其请求时,队列已经为空,因此其请求也会立即得到处理,然后两个客户机以较慢的速度接收结果。很抱歉。