java - forEach lambda 会导致竞争条件吗?

标签 java lambda thread-safety

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

相关文章:

java - 如何为 MongoDB 等 NoSql 绘制 UML 图?

c# - Lambda 表达式创建不相关的编译错误

java - 交换内容后构建新字符串的更好方法

java - GSON 是否应该被声明为 static final?

java - 将本地新对象传递给线程,线程安全吗?

java - 为什么我的 BufferedReader 不是 "Ready"?

java - Java 中是否有 heredoc 替代方案(heredoc 作为 PHP)?

java - 专辑封面的 Glide 失败并出现 JNI 错误

Java 8 设置流循环并与数组元素进行比较

c# - 编译器未解析为预期的扩展方法