2016-08-04 9 views
-2
final BigDecimal couponlessAmount = orderItems.stream() 
      .filter(item -> !item.getIsUseCoupon()) 
      .map(item -> item.getTotalAmount().subtract(item.getReduceProductAmount())) 
      .reduce(BigDecimal.ZERO, BigDecimal::add); 

何かがそれはJDK/JITのバグではないようだjava.util.ConcurrentModificationExceptionjava8ストリームマップが原因でConcurrentModificationExceptionが発生するのはなぜですか?

java.util.ConcurrentModificationException 
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1380) ~[?:1.8.0_77] 
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[?:1.8.0_77] 
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[?:1.8.0_77] 
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[?:1.8.0_77] 
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:1.8.0_77] 
    at java.util.stream.ReferencePipeline.reduce(ReferencePipeline.java:474) ~[?:1.8.0_77] 
    at com.yijiupi.himalaya.ordercompute.provider.domain.component.computer.CouponUseLimitComputer.getMaxUseAmount(CouponUseLimitComputer.java:103) ~[classes/:?] 
+0

時々、それはJDK、おそらくJITのバグだと思う – komite

答えて

0

の原因となります。通常はConcurrentModificationExceptionと同じように、orderItemsが別のスレッドから同時に変更されているという兆候です。適切な外部同期を行わずに、ArrayListを同時に使用しないでください。 ArrayListCollections.synchronizedListにラップすることは、トラバーサルを同期させないのでここでは十分ではないことに注意してください。代わりに(修正が稀である場合)CopyOnWriteArrayListを使用してください。

関連する問題