【发布时间】:2019-05-22 19:41:17
【问题描述】:
private Set<Job> myJobs = new HashSet<>();
public shouldDoWork(Work work)
return !myJobs.stream()
.map(job -> job.doWork(work))
.anyMatch(shouldDoWork -> !shouldDoWork);
public addJob(Job job) {
myJobs.add(job);
}
// also for remove
而且随时都有很多线程调用这个函数
java.util.ConcurrentModificationException 在 java.util.HashMap$KeySpliterator.tryAdvance(HashMap.java:1579) ~[?:1.8.0_202] 在 java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126) ~[?:1.8.0_202] 在 java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498) ~[?:1.8.0_202] 在 java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485) ~[?:1.8.0_202] 在 java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[?:1.8.0_202] 在 java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230) ~[?:1.8.0_202] 在 java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196) ~[?:1.8.0_202] 在 java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:1.8.0_202] 在 java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:449) ~[?:1.8.0_202] 在
知道为什么会抛出 ConcurrentModificationException 吗?
是因为集合 (myJobs) 正在改变,还是因为 shouldDoWork 的值被其他东西改变了?
【问题讨论】:
-
Job#doWork是否恰好从myJobs添加/删除元素? -
job.doWork(work) - 看起来 doWork 正在修改工作。
-
@JacobG。不,它没有,但还有其他线程添加/删除 myJobs
-
在anyMatch期间也抛出异常,不是吗?
标签: java multithreading