List.foreach()不能修改内部变量问题
可以看到截图中的foreach循环中的变量 allocatedNum,noAllocatedNum等不允许进行修改。
错误信息:Variable used in lambda expression should be final or effectively final
用普通的for循环时没有问题的
原因
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
由于这样的写法在多线程的情况下容易产生race condition竞态条件,导致结果不正确,除非我们能强制保证线程安全,这样引发的问题可能更多。
从设计者角度分析,java8提倡大家使用steam流,让大家习惯使用规约操作