Java 并发 : Changes made by task submitted to executor visible after future. get()

标签 java concurrency visibility

假设提交给执行器池的任务是这样的

class Task implements Future<Boolean> {
 public HeavyClass heavyClass;
 public Task(HeavyClass heavyClass) {
    this.heavyClass = heavyClass;
 }

 public Boolean call() {
   try {
     //do changes to heavyClass
     return true;
   } catch(Exception e) {
      return false;
   }
 }

现在在我做的调用线程中

Future<boolean> future = executor.submit(new Task(heavyClass));
try {
  boolean success = future.get();
  if (success) {
      //Assume all changes made to heavyClass are visible
  }
}

这是正确的吗?根据我的理解,这并不完全正确。在这种情况下确保纠正的最佳方法是什么?

最佳答案

这应该没问题。 Future 的任何可行实现都需要以这样一种方式编写,即标记为已完成涉及发布栅栏,而完成检查涉及获取栅栏。当 Future 标记为已完成时,应刷新对 heavyClass 的所有先前更改,并且应保证在任务的完成状态可见时对其他线程可见.

当然,依赖于此意味着相信实现执行器的人知道他们在做什么。如果您使用的是核心 Java 执行器之一,应该没问题。

关于Java 并发 : Changes made by task submitted to executor visible after future. get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24062816/

相关文章:

java - 将 JPanel 的内容复制到 BufferedImage 上

java - 大量单线程任务队列

javascript - 如果 AngularJS 中没有可见的子项,我该如何隐藏一个 div?

CSS 可见性 :hidden, Jquery 抓取元素

java - 无法在 Liferay portlet 应用程序中创建服务生成器

java - 为什么在覆盖现有方法时调用父类(super class)方法?

java - 从 Thunderbird 扩展调用 java 方法

java - 为 BlockingQueue(或其他东西)提供 + drainTo 的非阻塞方式

java - 在 catch block 中调用 ReentrantReadWriteLock#lock() 是否错误?

javascript - 在 Javascript 中启用 ASP 隐藏标签