[英]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.