完成“ Future <?>”任务后检查字段是否安全?

时间:2019-10-10 13:00:07

标签: java concurrency future completable-future

在成功调用Future<?>之后,检查在future.get()中执行的任务所修改的字段是否安全?
(是否可以确保完成设置值,然后看到新值?)

我将在调用future.get()的同一线程上检查该字段。

还是我应该仅使用future.get()的返回值,而不应该期望它像这样工作?

示例:

class MyData {
    private int a;

    public void setA(int a) { this.a = a; }
    public int getA() { return a; }
}

public class MainClass {
    public static void main(String[] args) {
        final Executor executor = Executors.newFixedThreadPool(15);

        final List<MyData> objects = Arrays.asList(new MyData(), new MyData() /* ... */);

        final Future<Void> future1 = CompletableFuture.supplyAsync(() -> { objects.get(0).setA(1); return null; }, executor);
        final Future<Void> future2 = CompletableFuture.supplyAsync(() -> { objects.get(1).setA(2); return null; }, executor);
        /* ... */

        a.get();
        b.get();
        /* ... */

        // Is it safe here to check the `a` field of the objects?
        assert objects.get(0).getA() == 1;
        assert objects.get(1).getA() == 2;
    }
}

2 个答案:

答案 0 :(得分:0)

Future#get()的文档中说:

  

在必要时等待计算完成,然后检索其结果。

因此,一旦调用Future.get()方法,就可以完全断言,因为这些值将在那时解析。

答案 1 :(得分:0)

Future状态的Javadoc

  

内存一致性影响:异步执行的操作   在相应的之后执行 happen-before 操作   Future.get()在另一个线程中。

由于get仅在完成相应的计算(setA调用和return)后返回,因此该计算通过 happen-before 关系可见调用get之后的任何代码。您对getA的调用发生在Future#get之后,因此它将看到发生在其之前的setA的结果。

相关问题