Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于并行线程写入固定大小数组的不同部分,是否有线程安全的Java数据结构?_Java_Arrays_Multithreading_Concurrency_Thread Safety - Fatal编程技术网

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

对于并行线程写入固定大小数组的不同部分,是否有线程安全的Java数据结构?,java,arrays,multithreading,concurrency,thread-safety,Java,Arrays,Multithreading,Concurrency,Thread Safety,这就是我试图实现的: 固定大小(比如1000个元素)的(单体)数组 写入较小的线程池(您应该能够使用。您可以安全地更新索引或使用compareAndSet自动更新(尽管您似乎不需要) 编辑以解决akhil_mittal的问题。 让我们将思路从更新数组切换到更新单个字段。如果要更新类中的字段,则写操作将在不撕字的情况下进行,而不是一个线程中的一些位和另一个线程中的一些位。数组索引也是如此 但是,如果要通过多个线程更新类中的字段,则一个线程的写入可能不会立即对另一个线程可见。这是因为写入可能会在处

这就是我试图实现的:

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


  • 写入较小的线程池(您应该能够使用。您可以安全地更新索引或使用
    compareAndSet
    自动更新(尽管您似乎不需要)

    编辑以解决akhil_mittal的问题。 让我们将思路从更新数组切换到更新单个字段。如果要更新类中的字段,则写操作将在不撕字的情况下进行,而不是一个线程中的一些位和另一个线程中的一些位。数组索引也是如此

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

    我们还需要关注线程安全吗

    您需要像担心非易失性字段的线程安全一样担心线程安全。事实证明,DVK可能不需要担心写操作立即可见


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

    其他人已经回答了您的问题,因此我将添加示例:

  • 通过不同线程添加到数组是并行排序的工作方式
  • 使用Fork/Join框架创建数组是通过工作线程写入数组的不同部分来实现的

  • 继续做吧,你很好。

    注意:基于,我认为常规数组应该可以工作,但我是一个Java新手,不能确定。因此,写入数组索引提供了与写入非易失性字段相同的内存语义。如果在排序之前查找true,则写入单个数组时会丢失它。@JohnVint-在这种情况下,不在乎以前发生过什么。我总是(通过应用程序语义)确保在写入数据之前不会读取数据。在这种情况下,您对线程安全的担忧应该与写入非易失性字段时一样。如果您决定这样做,那么写入数组也应该可以。如果线程总是在固定索引上写入,那么IMO就不担心线程安全因此,请纠正我的错误。如果所有线程都将在固定的连续位置写入,我们还需要担心线程安全吗?请澄清:)可能会有过大的杀伤力。OP只询问写入数组的问题。没有提到其他线程同时读取数组。如果目标只是使用N个线程来初始化数组,并且如果在初始化完成之前没有线程会读取数组,那么唯一需要同步的地方就是在最后,此时(并确保)所有初始化工作人员都已完成。AtomicxxxxxxArray将同步每次写入,这将使速度减慢一点。@jameslarge您是对的,很可能是这样。如果你有兴趣把它作为一个答案,我认为这是合理的。根据OP的评论,这似乎也是正确的答案。使用Fork/Join框架创建数组是通过工作线程写入数组的不同部分来实现的。这是因为所有线程在fork/join的连接方面都是同步的。只是想避免混淆为什么ForkJoin有效,以及为什么我建议使用原子引用阵列。