【发布时间】:2017-06-16 11:41:55
【问题描述】:
考虑以下使用 java 8 流的愚蠢程序:
private int biggestInt;
private void run() {
ExecutorService executor = Executors.newWorkStealingPool();
List<Callable<Integer>> callables = new ArrayList<>();
for (int i = 0; i<50; i++) {
callables.add(randomInt());
}
try {
executor.invokeAll(callables)
.stream()
.map(future -> {
try {
return future.get();
} catch (Exception e) {
throw new IllegalStateException(e);
}
})
.forEach(this::compareBiggestInt);
} catch (InterruptedException e) { /* do nothing */ }
}
private Callable<Integer> randomInt() {
return () -> {
Random random = new Random(System.currentTimeMillis());
return random.nextInt();
};
}
private void compareBiggestInt(Integer in) {
if (in > biggestInt)
biggestInt = in;
}
我的问题是,forEach(this::compareBiggestInt) 是否并行执行,因此会在最大 Int 上引入竞争条件?
如果是这样,我怎样才能避免这种竞争条件? 例如,我可以像下面这样更改方法吗?
private synchronized void compareBiggestInt(Integer in) {[...]}
感谢任何帮助!
【问题讨论】:
标签: java concurrency java-8 java-stream