首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java创建原子RingBuffer

用Java创建原子RingBuffer
EN

Stack Overflow用户
提问于 2015-12-23 23:14:15
回答 1查看 760关注 0票数 2

我在考虑如何用Java和Android实现线程安全的RingBuffer (由于某种原因,即使这么多年之后,甚至连一个循环队列也没有。)因此,没有(循环/环)ByteBuffer,也没有(循环/环)(缓冲区/队列)。

即使是第三方的大多数RingBuffer实现也被认为不是线程安全的,这让我觉得它并不像我想的那样简单。我想的是做这样的事:

  • 有一个对象(比如RingBufferPosition),它封装了头部和尾部的位置。
  • 让RingBuffer将AtomicReference维护到RingBufferPosition
  • 当线程添加某项内容时,它将创建一个临时对象(不幸的是,我不了解足够的Java来确定这一点,而是“堆栈分配的”对象),它将被一次又一次地循环起来,用新更新的头和尾更新它,直到它成功地实现CAS。
  • 当线程删除某些内容时,它将执行类似于添加某些内容的操作。
  • 所有内容都是在分配给最大长度的数组中访问的,因此头和尾可以在O(1)时间内访问/更新当前元素。

这是否有效,更好的是,它会比简单地同步对集合的访问带来任何好处吗?

可以找到一个小的代码示例/伪代码(还没有运行,我甚至不知道如何远程测试原子数据结构,我计划使用它来缓冲/流媒体,但我还没有做到这一点,因为我需要首先创建这个)。我有一些评论/文件,详细说明了我在那里的关切。

最后,为了解决一个可能的“为什么”的问题,如“为什么你需要这样的表现”,我将诚实地回答。我一直认为数据结构,特别是原子/无锁的数据结构非常有趣,我发现这是一个很好的学习练习,而且我一直想创建一个环形缓冲区。我本来可以“同步”所有的东西,但是我也很重视性能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-24 01:45:22

多个读取器/多个写入器环缓冲区是很棘手的。

您的方法不起作用,因为您无法原子地更新起始/结束位置和数组内容。考虑添加到缓冲区:如果首先更新结束位置,则在更新数组之前,缓冲区包含无效项。如果首先更新数组,那么就没有什么可以阻止同时添加的内容在同一个数组元素上执行。

处理这些问题的方法有很多,但是不同的方法有不同的权衡,如果您可以摆脱多个读者或多个编写者的需求,您就有了更好的选择。

如果我不得不猜测为什么我们在标准库中没有并发的环缓冲区,我会说这是因为没有一种最好的方法来实现它,这对大多数场景都是很好的。相反,用于ConcurrentLinkedQueue的数据结构简单而优雅,并且在需要并发链接列表时是一个明显的选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34445149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档