java - 对于写入固定大小数组的不同部分的并行线程,是否存在线程安全的 Java 数据结构?

标签 java arrays multithreading concurrency thread-safety

这就是我要实现的:

  • 固定大小(比如 1000 个元素)的(单一)数组

  • 线程池并行向该数组写入较小的 (<=100) 元素 block

  • 我们保证池中所有线程的总写入量将写入 <1000 个元素,因此我们永远不必增加数组。

  • 写入顺序无关紧要,但它们必须是连续的,例如线程 1 填充数组索引 0-49,线程 3 索引 50-149,线程 2 索引 149-200

是否有线程安全的数据结构来实现这一点?

显然,我需要同步“索引管理器”,它分配数组索引中给定线程需要写入的位置。但是是否有一个数组本身的 Java 数据结构可以用于此,而不用担心线程安全?

最佳答案

您应该能够使用 AtomicReferenceArray .您可以安全地更新索引或使用 compareAndSet 进行原子更新(尽管看起来您不需要这样做)。

编辑以解决 akhil_mittal 的问题。

让我们将思路从更新数组切换到更新单个字段。如果您要更新类中的字段,写入将发生而不会发生字撕裂,写入将不会是来自一个线程的一些位和来自另一个线程的一些位的情况。数组索引也是如此。

但是,如果您要通过多个线程更新类中的字段,则一个线程的写入可能不会立即对另一个线程可见。这是因为写入可能会在处理器高速缓存中进行缓冲,并最终刷新到其他处理器。对特定索引的数组写入也是如此。它最终会可见,但不保证在排序前发生。

do we still need to concern about thread safety

您需要担心线程安全,就像您需要担心非 volatile 字段的线程安全一样。事实证明,DVK 可能不需要担心写入立即可见。

这个答案的重点是解释数组写入不一定是线程安全的,使用 AtomicReferenceArray 可以保护您免受延迟写入的影响。

关于java - 对于写入固定大小数组的不同部分的并行线程,是否存在线程安全的 Java 数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30171349/

相关文章:

java - JAXB.marshal 阻止 Web 服务调用

java - 特定使用 Servlet 后将 mysql 列值重置为默认值

java - ItemAnimator如何安排动画一个接一个地开始

javascript - 将同一线性方程的所有直线分组

java - 验证项目是否在开始日期和结束日期内

performance - 有人用过谷歌性能工具吗?

c# - 有限的并发任务调度器,可以交错任务以明确排序

java - 通过bash获取Java程序的输入输出

c++ - 一维和二维数组之间的选择

c - 全局/本地/静态互斥锁的区别?