java - 在 invokeAll 之后执行程序任务的所有副作用是否可见?

标签 java multithreading concurrency java.util.concurrent memory-model

如果我使用 invokeAll 将一些任务提交给 Executor,我是否可以保证提交的线程看到任务执行的所有副作用,即使我不这样做是否对每个返回的 Future 调用 get()

从实际的角度来看,这似乎是一个有用的保证,但我在 javadoc 中没有看到任何内容。

更准确地说,在 invokeAll() 返回 happen-before 提交给执行者的 Callable 主体中执行所有操作打电话?

在每个 future 上无用地调用 get() 是很烦人的,而实际上返回类型是 Void 并且没有抛出异常 - 所有的工作都发生在副作用。

最佳答案

来自 ExecutorService 的文档:

Actions in a thread prior to the submission of a Runnable or Callable task to an ExecutorService happen-before any actions taken by that task, which in turn happen-before the result is retrieved via Future.get().

当我阅读本文时,任务提交存在内存障碍,因此可能您需要调用 get()在你列表中的最后一个任务上,而不是其他任务。

但是,自从调用 get()是确定任务是完成还是抛出的唯一方法,我仍然会在每个 Future 上调用它,无论内存保证如何。

关于java - 在 invokeAll 之后执行程序任务的所有副作用是否可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7412904/

相关文章:

java - 向 PE SDK UI 添加自定义按钮

multithreading - 分发工作同步和fork-join并行编程方法之间有什么区别

java - 在多进程设置中生成 6 位字母数字唯一标识符的任何算法/逻辑

java - Android:如何在本地写入文件并将其保存到下载中

java - WebSphere Application Server JVM 参数未被正确读取

java - 对多个列表中的元素进行分组

java - 内存一致性错误与线程干扰

java - 处理聊天输入或停止输入事件 (Android)

JavaFX:线程 “JavaFX Application Thread” java.lang.RuntimeException 中的异常:java.lang.reflect.InitationTargetException

iOS GCD自定义并发队列执行顺序