我发现我对并行流提供的一致性保证略有争议:
1. myList.parallelStream().map(mymapper).forEach(myFn)
2. // Is myFn guaranteed to be called for each element in myList here ?
换句话说,我可以确定将执行myFn的所有forkJoinTasks在第2行完成吗?
答案 0 :(得分:3)
是。完整流管道中的并行任务同步执行。只有在完成所有任务后才会执行第2行。
package documentation for java.util.stream州,
在几乎所有情况下,终端操作都很渴望,在返回之前完成数据源的遍历和管道的处理。
但请注意,forEach
任务完成的任何副作用可能不会对其他线程可见。在实践中,forEach
只能通过使其动作执行副作用来操作。如Stream.forEach
javadoc中所述,操作必须使用正确的同步或其他构造,以确保线程安全操作和副作用的正确可见性。