执行程序服务的并发数组访问

Concurrent array access by executor service

数组元素是否在 worker 之间正确发布?

假设我有一个大数组(任何原子数据类型,所以不是 longdouble),

换句话说,它保证前一个worker的最后一次写入发生在下一个worker的第一次读取之前?

我是否应该(或为了最佳实践或其他原因)让第一个工作人员 return 数组,即使引用与我已有的相同?

[编辑] 一些背景:我使用 byte 数组或 short 数组,它们代表图像并且每个使用多达 500,000,000 个元素。我对每个元素进行简单的运算。

数组的元素不是 volatile,因此它们可能由 CPU 按线程缓存。因此,第一个工作人员有可能初始化一些数组元素,但第二个工作人员由于缓存而看不到它。

要确保数组元素本身是原子的,您可以使用 AtomicReferenceArray

来自package java.util.concurrent JavaDoc

The methods of all classes in java.util.concurrent and its subpackages extend these guarantees to higher-level synchronization. In particular:

Actions taken by the asynchronous computation represented by a Future happen-before actions subsequent to the retrieval of the result via Future.get() in another thread.

Actions in a thread prior to the submission of a Runnable to an Executor happen-before its execution begins. Similarly for Callables submitted to an ExecutorService.

据此,在您的场景中从第二个工作人员访问数组似乎非常安全。