我這邊做了一個實體來驗證JAVA8多執行緒操作parallelStream()執行緒安全問題
List<Integer> integers = Lists.newArrayList();
for (int i = 0; i < 100; i++){
//插入100個資料
integers.add(i);
}
System.out.println(integers.parallelStream().count());
//多管道遍歷
List<Integer> integerList = Lists.newArrayList();
integers.parallelStream().forEach(e -> {
//添加list的方法
integerList.add(e);
try {
//休眠100ms,假裝執行某些任務
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
});
System.out.println(integerList.parallelStream().count());//97
實體中建立兩個陣列集合,一個賦予100個資料,另一個為空,通過parallelStream()多執行緒遍歷方法呼叫 integerList 的寫功能,結果發現最后integerList 只是寫入97條資料,丟失的三條資料被執行緒“吃“掉了,所以說這種并行流還是謹慎使用,
下面是我寫的一個并行流對集合操作的一個解決辦法,需要并行流操作的集合創建鎖集合
List<Integer> integers = Lists.newArrayList();
for (int i = 0; i < 100; i++){
//插入100個資料
integers.add(i);
}
System.out.println(integers.parallelStream().count());
//多管道遍歷 這邊處理的時候創建鎖集合
List<Integer> integerList = Collections.synchronizedList(new ArrayList<>());
integers.parallelStream().forEach(e -> {
//添加list的方法
//System.out.println("ThreadName:" + Thread.currentThread().getName());
integerList.add(e);
try {
//休眠100ms,假裝執行某些任務
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
});
System.out.println(integerList.parallelStream().count());//100
輸出結果正確插入了100條資料

驗證多執行緒輸出:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/207200.html
標籤:java
