Java CompletableFuture线程安全问题 5C

有如下代码,想问下这种情况下会有线程安全问题吗,我回调方法里去赋值this.result1和this.result2,然后在最后去读者两个字段,读和写不是同一线程不用同步吗?

 public void newInit() throws ExecutionException, InterruptedException {
    CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> {
        return 1L;
    }).thenAccept(result -> {
        this.result1 = result;
    });
    CompletableFuture cf2 = CompletableFuture.supplyAsync(() -> {
        return 2L;
    }).thenAccept(result -> {
        this.result2 = result;
    });
    CompletableFuture.allOf(cf1, cf2).get();
        System.out.println(this.result1)
}

3个回答

首先因为现在的应用越来越复杂,越来越多模块多系统之间相互依赖,一个操作可能需要使用多个模块或者多个系统提供的多个服务来完成一个功能,如果每个服务顺序的执行,可能需要消耗很多时间,或者前端用户需要得到及时响应,不需要等待所有服务完成便可以返回部分结果,而且现在的计算机处理器性能越来越强大,多核处理器越来越普遍,核心数也越来越多,使用多线程可以更加充分利用硬件的资源,不论是什么原因异步编程应运而生。

CompletableFuture.allOf(cf1, cf2).get();
--- 这里已经包装thread1和thread2都执行完了,所以result1都写完了,后面再读就不需要同步了

CompletableFuture.allOf(cf1, cf2).get(); // 这一行 是等待异步计算执行结束 ,也就是等待其他线程(在这里就是cf1,cf2的线程)执行结束,返回结果,

也就是说,这一行下面的语句只是在主线程里执行了,

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问