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

Mar*_*mus 5 java concurrency executorservice happens-before

阵列元素是否在工人之间正确发布?

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

  • 我创建了一个填充数组的工作者,我传递给它的构造函数,
  • 我提交工人执行人,并等待,直到它完成(future.get()).工人不会退货.它只是填充我的阵列.
  • 然后,我立即在其构造函数中创建并提交具有相同数组的另一个worker.它看到了最新的价值吗?

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

我是否应该(或者为了最佳实践或某事)让第一个工作人员返回数组,即使引用与我已经拥有的引用相同?

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

Den*_*kov 3

来自包 java.util.concurrent JavaDoc

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

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

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

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