有如下代碼,想問下這種情況下會有線程安全問題嗎,我回調方法里去賦值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)
}
2 回答

精慕HU
TA貢獻1845條經驗 獲得超8個贊
首先因為現在的應用越來越復雜,越來越多模塊多系統之間相互依賴,一個操作可能需要使用多個模塊或者多個系統提供的多個服務來完成一個功能,如果每個服務順序的執行,可能需要消耗很多時間,或者前端用戶需要得到及時響應,不需要等待所有服務完成便可以返回部分結果,而且現在的計算機處理器性能越來越強大,多核處理器越來越普遍,核心數也越來越多,使用多線程可以更加充分利用硬件的資源,不論是什么原因異步編程應運而生。

12345678_0001
TA貢獻1802條經驗 獲得超5個贊
CompletableFuture.allOf(cf1, cf2).get();
--- 這里已經包裝thread1和thread2都執行完了,所以result1都寫完了,后面再讀就不需要同步了
添加回答
舉報
0/150
提交
取消