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

something causes the java.util.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/:?]
Tagir Valeev
  • 97,161
  • 19
  • 222
  • 334
komite
  • 13
  • 2

1 Answers1

0

It's unlikely to be JDK/JIT bug. As usually with ConcurrentModificationException it's a sign that your orderItems is concurrently modified from another thread. You should not use ArrayList concurrently without providing proper external synchronization. Note that wrapping ArrayList into Collections.synchronizedList is not enough here as it does not synchronizes traversals. As an alternative (if modifications are rare) use CopyOnWriteArrayList.

Tagir Valeev
  • 97,161
  • 19
  • 222
  • 334