我不确定lambdas在实践中是如何工作的,我担心因为在某些情况下,如果你错误地使用lambdas会导致错误,例如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?
答案 0 :(得分:3)
如果您尝试修改在每个循环运行时迭代的集合,则会收到ConcurrentModificationException。这可以完全在一个单独的线程中完成,但是当您尝试修改循环体中的集合时更常见。
是否将不同的调用传递给JVM认为合适的不同线程,这会导致竞争条件可能导致最小计算错误?
没有。上面的示例中没有发生多线程。