0

我正在寻找一个线程安全的无限阻塞fifo,它由一个固定的缓冲区(如数组)支持。语义是多个读取器和写入器线程可以安全地访问它。如果缓冲区已满,写入程序会阻塞并覆盖最旧的项目。如果缓冲区为空,则读取器阻塞。当添加的总数和删除的总数的计数器围绕内部缓冲区大小一圈或多次时,必须保持 Fifo 排序。

有趣的是,我通常会寻找的地方(java 自己的并发集合、公共集合、番石榴)看不到对这种“明显”要求的即时答案。

4

5 回答 5

3

您实际上是在描述ArrayBlockingQueue

它是线程安全的,并且专为此目的而设计:

  • 如果队列已满,写入者会等待空间可用
  • 如果元素可用,读者可以等待指定的等待时间
于 2013-02-18T08:29:44.110 回答
0

听起来您正在寻找ArrayBlockingQueue.

于 2013-02-18T08:29:52.967 回答
0

java.util.concurrent.ArrayBlockingQueue怎么样

于 2013-02-18T08:31:55.180 回答
0

目前尚不清楚您是在寻找无限阻塞队列还是有界阻塞队列。

  1. 有界阻塞队列:java.util.concurrent.ArrayBlockingQueue
  2. 无限阻塞队列(仅受 RAM 约束):java.util.concurrent.LinkedBlockingQueue

对于所有情况,我建议使用 ArrayBlockingQueue。

于 2013-02-18T08:39:05.470 回答
0

对于无限BlockingQueue队列,您必须使用队列委托(也许)创建自己的实现接口的类ArrayBlockingQueue,当队列满时,调整大小,创建一个新的更大的委托。这应该是无限的,MAX_INT并且避免了链接队列所涉及的 GC 开销(需要为每个插入的对象创建节点)。如果需要,您也可以缩小委托。

于 2013-02-18T09:35:12.403 回答