forEach lambda可以导致竞争条件吗?

时间:2018-04-26 09:48:29

标签: java lambda thread-safety

我不确定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?

1 个答案:

答案 0 :(得分:3)

如果您尝试修改在每个循环运行时迭代的集合,则会收到ConcurrentModificationException。这可以完全在一个单独的线程中完成,但是当您尝试修改循环体中的集合时更常见。

  

是否将不同的调用传递给JVM认为合适的不同线程,这会导致竞争条件可能导致最小计算错误?

没有。上面的示例中没有发生多线程。