我正在寻找一个线程安全的无限阻塞fifo,它由一个固定的缓冲区(如数组)支持。语义是多个读取器和写入器线程可以安全地访问它。如果缓冲区已满,写入程序会阻塞并覆盖最旧的项目。如果缓冲区为空,则读取器阻塞。当添加的总数和删除的总数的计数器围绕内部缓冲区大小一圈或多次时,必须保持 Fifo 排序。
有趣的是,我通常会寻找的地方(java 自己的并发集合、公共集合、番石榴)看不到对这种“明显”要求的即时答案。
我正在寻找一个线程安全的无限阻塞fifo,它由一个固定的缓冲区(如数组)支持。语义是多个读取器和写入器线程可以安全地访问它。如果缓冲区已满,写入程序会阻塞并覆盖最旧的项目。如果缓冲区为空,则读取器阻塞。当添加的总数和删除的总数的计数器围绕内部缓冲区大小一圈或多次时,必须保持 Fifo 排序。
有趣的是,我通常会寻找的地方(java 自己的并发集合、公共集合、番石榴)看不到对这种“明显”要求的即时答案。
听起来您正在寻找ArrayBlockingQueue
.
目前尚不清楚您是在寻找无限阻塞队列还是有界阻塞队列。
对于所有情况,我建议使用 ArrayBlockingQueue。
对于无限BlockingQueue
队列,您必须使用队列委托(也许)创建自己的实现接口的类ArrayBlockingQueue
,当队列满时,调整大小,创建一个新的更大的委托。这应该是无限的,MAX_INT
并且避免了链接队列所涉及的 GC 开销(需要为每个插入的对象创建节点)。如果需要,您也可以缩小委托。