执行程序服务的并发数组访问
Concurrent array access by executor service
数组元素是否在 worker 之间正确发布?
假设我有一个大数组(任何原子数据类型,所以不是 long
或 double
),
- 我创建了一个工人来填充我传递给它的构造函数的数组,
- 我将 worker 提交给执行者,然后等待它完成(例如 和
future.get()
)。工人没有 return 任何东西。它刚好填满了我的数组。
- 然后,我立即在其构造函数中创建并提交另一个具有相同数组的工人。它是否看到最新值?
换句话说,它保证前一个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.
据此,在您的场景中从第二个工作人员访问数组似乎非常安全。
数组元素是否在 worker 之间正确发布?
假设我有一个大数组(任何原子数据类型,所以不是 long
或 double
),
- 我创建了一个工人来填充我传递给它的构造函数的数组,
- 我将 worker 提交给执行者,然后等待它完成(例如 和
future.get()
)。工人没有 return 任何东西。它刚好填满了我的数组。 - 然后,我立即在其构造函数中创建并提交另一个具有相同数组的工人。它是否看到最新值?
换句话说,它保证前一个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.
据此,在您的场景中从第二个工作人员访问数组似乎非常安全。