在 Java 中创建一个 Atomic RingBuffer

Creating an Atomic RingBuffer in Java

我在考虑如何在 Java 和 Android 中实现一个线程安全的 RingBuffer(因为某些原因有 none,即使过了这么多年,甚至不是循环队列。所以,没有 (Circular/Ring)ByteBuffer,也没有 (Circular/Ring)(Buffer/Queue).

据说大多数第三方的 RingBuffer 实现都不是线程安全的,这让我觉得它真的不像我想象的那么简单。我在想的是做这样的事情:

与简单地同步对集合的访问相比,这是否有效,甚至更好,是否会产生任何好处?

一小段代码sample/pseudocode(还没运行,我连远程测试原子数据结构都不会,打算用它buffering/streaming媒体,但我还没有走那么远,因为我需要先创建它)可以找到 here。我有 comments/documentation 详细说明了我的担忧。

最后,要解决一个可能的 "Why" 问题,例如 "Why do you need such performance",我会说实话。我一直觉得数据结构,尤其是 atomic/lock-free 数据结构非常有趣,我发现这是一个很好的学习练习,而且我一直想创建一个 Ring Buffer。我本来可以 "synchronized" 拥有一切,但我也很看重性能。

多个 reader/multiple 编写器环形缓冲区很棘手。

您的方法行不通,因为您无法自动更新 start/end 位置和数组内容。考虑添加到缓冲区:如果您先更新结束位置,那么当缓冲区包含无效项时,在更新数组之前会有片刻。如果您先更新数组,那么就没有什么可以阻止同时添加的东西踩在同一个数组元素上。

有很多方法可以解决这些问题,但是各种方法都有不同的取舍,如果您可以摆脱多个 reader 或多个编写器的要求,您就有更好的选择。

如果我不得不猜测为什么我们在标准库中没有并发环形缓冲区,我会说这是因为没有一种最好的实现它的方法适用于大多数情况.相比之下,用于 ConcurrentLinkedQueue 的数据结构简单而优雅,是需要并发链表时明显的选择。