Future<?>成功調用后檢查由 a 中執(zhí)行的任務修改的字段是否安全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 回答

拉莫斯之舞
TA貢獻1820條經驗 獲得超10個贊
Future
狀態(tài)的 javadoc
內存一致性影響:異步計算所采取的操作發(fā)生
Future.get()
在另一個線程中相應操作之后 。
由于get
僅在相應計算完成時返回(setA
調用 和),因此該計算通過調用 后與任何代碼的發(fā)生之前return
關系可見。您對 的調用發(fā)生在 后,因此它將看到之前發(fā)生的的結果。get
getA
Future#get
setA

LEATH
TA貢獻1936條經驗 獲得超7個贊
正如文檔所說Future#get()
:
如有必要,等待計算完成,然后檢索其結果。
因此,在調用該方法后進行斷言是完全安全的,Future.get()
因為屆時這些值將被解析。
添加回答
舉報
0/150
提交
取消