java中的无限fifo

时间:2013-02-18 08:27:14

标签: java multithreading concurrency fifo

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

有趣的是,我想要寻找的常用地方(java自己的并发馆藏,公共藏品,番石榴)并不能立即得到这样一个明显的答案。需求。

5 个答案:

答案 0 :(得分:3)

您实际上在描述ArrayBlockingQueue

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

    如果队列已满,
  • 编写者等待空间可用
  • 如果元素可用,读者可以等待指定的等待时间

答案 1 :(得分:0)

听起来你正在寻找ArrayBlockingQueue

答案 2 :(得分:0)

答案 3 :(得分:0)

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

  1. 有界阻塞队列: java.util.concurrent.ArrayBlockingQueue
  2. 无限阻塞队列(仅限RAM约束): java.util.concurrent.LinkedBlockingQueue
  3. 对于所有情况,我建议使用ArrayBlockingQueue。

答案 4 :(得分:0)

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