簡體   English   中英

ArrayList的大小被parallel stream修改

[英]Size of ArrayList modified by parallel stream

List<Integer> data = new ArrayList<>();
IntStream.range(0,100).parallel().forEach(data::add);
System.out.println(data.size());

為什么上面的代碼並不總是打印 100? 當打印結果為例如 94 時,這些未計算在內的數字會發生什么情況? 我知道我可以使用 forEachOrdered()、CopyOnWriteArrayList 或 Collections.synchronizedList()。 但是在上面的例子中缺少 6 個元素到底發生了什么? 每個線程是否都有自己的 ArrayList 副本,然后以某種方式將它們組合在一起?

因為ArrayList不是線程安全的。

當兩個線程試圖同時增加該計數器時,其中一個會覆蓋另一個的結果。

嘗試使用線程安全集合來完成它,你會沒事的。

ArrayList<E>不是同步/線程安全的,這就是原因。

您可以使用同步列表,如:

List<Integer> data = Collections.synchronizedList(new ArrayList<>());
IntStream.range(0,100).parallel().forEach(data::add);
System.out.println(data.size());

forEachOrdered ,如:

List<Integer> data = new ArrayList<>();
IntStream.range(0,100).parallel().forEachOrdered(data::add);
System.out.println(data.size());

正如它的文件所說,那:

該操作可以在庫選擇的任何線程中執行。

例如,您可以使用 synchronizedCollection()。 將幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM