我在考虑如何用Java和Android实现线程安全的RingBuffer (由于某种原因,即使这么多年之后,甚至连一个循环队列也没有。)因此,没有(循环/环)ByteBuffer,也没有(循环/环)(缓冲区/队列)。
即使是第三方的大多数RingBuffer实现也被认为不是线程安全的,这让我觉得它并不像我想的那样简单。我想的是做这样的事:
这是否有效,更好的是,它会比简单地同步对集合的访问带来任何好处吗?
可以找到一个小的代码示例/伪代码(还没有运行,我甚至不知道如何远程测试原子数据结构,我计划使用它来缓冲/流媒体,但我还没有做到这一点,因为我需要首先创建这个)。我有一些评论/文件,详细说明了我在那里的关切。
最后,为了解决一个可能的“为什么”的问题,如“为什么你需要这样的表现”,我将诚实地回答。我一直认为数据结构,特别是原子/无锁的数据结构非常有趣,我发现这是一个很好的学习练习,而且我一直想创建一个环形缓冲区。我本来可以“同步”所有的东西,但是我也很重视性能。
发布于 2015-12-24 01:45:22
多个读取器/多个写入器环缓冲区是很棘手的。
您的方法不起作用,因为您无法原子地更新起始/结束位置和数组内容。考虑添加到缓冲区:如果首先更新结束位置,则在更新数组之前,缓冲区包含无效项。如果首先更新数组,那么就没有什么可以阻止同时添加的内容在同一个数组元素上执行。
处理这些问题的方法有很多,但是不同的方法有不同的权衡,如果您可以摆脱多个读者或多个编写者的需求,您就有了更好的选择。
如果我不得不猜测为什么我们在标准库中没有并发的环缓冲区,我会说这是因为没有一种最好的方法来实现它,这对大多数场景都是很好的。相反,用于ConcurrentLinkedQueue的数据结构简单而优雅,并且在需要并发链接列表时是一个明显的选择。
https://stackoverflow.com/questions/34445149
复制相似问题