我不确定 lambda 在实践中是如何工作的,而且我很担心,因为在某些情况下,如果您使用不当,lambda 可能会导致诸如 ConcurrentModificationExceptions 之类的错误,这似乎表明存在竞争条件。
考虑下面的代码。
private class deltaCalculator{
Double valueA;
Double valueB;
//Init delta
volatile Double valueDelta = null;
private void calculateMinimum(List<T> dataSource){
dataSource.forEach((entry -> {
valueA = entry.getA();
valueB = entry.getB();
Double dummyDelta;
dummyDelta = Math.abs(valueA - valueB);
if(valueDelta == null){
setDelta(dummyDelta);
}else {
setDelta((valueDelta > dummyDelta) ? dummyDelta : valueDelta);
}
}));
}
private void setDelta(Double d){
this.valueDelta = d;
}
}
forEach 循环如何运行?是否将不同的调用传递给 JVM 认为合适的不同线程,从而导致出现可能导致最小值计算不正确的竞争条件?
如果不是,为什么 forEach lambda 可以抛出 ConcurrentModificationException?
最佳答案
如果您在 for each 循环运行时尝试修改正在迭代的集合,您将得到一个 ConcurrentModificationException。这可以完全在单独的线程中完成,但更常见的情况是当您尝试修改循环体中的集合时。
Do different calls get passed to different threads where the JVM considers it appropriate, opening up the possibility of a race condition that could lead to incorrect minimum calculation?
没有。上面的示例中没有发生多线程。
关于java - forEach lambda 会导致竞争条件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50039887/