猿问

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

Future<?>成功调用后检查由 a 中执行的任务修改的字段是否安全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;

    }

}


开心每一天1111
浏览 110回答 2
2回答

拉莫斯之舞

Future状态的 javadoc内存一致性影响:异步计算所采取的操作发生Future.get()在另一个线程中相应操作之后 。由于get仅在相应计算完成时返回(setA调用 和),因此该计算通过调用 后与任何代码的发生之前return关系可见。您对 的调用发生在 后,因此它将看到之前发生的的结果。getgetAFuture#getsetA

LEATH

正如文档所说Future#get():如有必要,等待计算完成,然后检索其结果。因此,在调用该方法后进行断言是完全安全的,Future.get()因为届时这些值将被解析。
随时随地看视频慕课网APP

相关分类

Java
我要回答