java.util.concurrent.LinkedBlockingQueue不是FIFO?

时间:2012-09-20 22:14:05

标签: 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应用程序的代码审查中,它使用单例{{1}加上一些异步工作线程来处理来自客户端的请求条目。

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

1 个答案:

答案 0 :(得分:3)

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

你怎么知道'来自A的条目和来自B的条目是交错的'?