5

数组元素是否在工作人员之间正确发布?

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

  • 我创建了一个工人来填充我传递给它的构造函数的数组,
  • 我将工人提交给执行者,并等到它完成(例如with future.get())。工人不返回任何东西。它只是填满了我的数组。
  • 然后,我立即在其构造函数中创建并提交另一个具有相同数组的工作人员。它是否看到最新的值?

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

我是否应该(或出于最佳实践或其他目的)让第一个工作人员返回数组,即使引用与我已经拥有的引用相同?

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

4

2 回答 2

3

包 java.util.concurrent JavaDoc

java.util.concurrent 及其子包中所有类的方法将这些保证扩展到更高级别的同步。尤其:

在另一个线程中通过 Future.get() 检索结果之后,由 Future 表示的异步计算所采取的操作发生在操作之前。

在将 Runnable 提交给 Executor 之前,线程中的操作发生在其执行开始之前。对于提交给 ExecutorService 的 Callables 也是如此。

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

于 2015-08-31T19:05:16.467 回答
2

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

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

于 2015-08-22T13:56:11.360 回答