在多线程环境中遍历集合:ConcurrentModificationException

时间:2018-12-10 10:30:48

标签: java multithreading collections java-threads

我得到一个ConcurrentModificationException,因为多个线程同时访问了此代码:

public void flush(Audit... audits) {
   // Copy first them on memory
   this.pendingAudits.addAll(Arrays.asList(audits));

   for (Iterator<Audit> it = this.pendingAudits.iterator(); it.hasNext();) {
       // Do something
       it.remove();
   }
}

我在pendingAudits上得到了一个迭代器,并且在其他线程可以添加其他审核的同时删除了每个元素。

如何优雅地解决它?

1 个答案:

答案 0 :(得分:2)

一种快速的解决方案是将对this.pendingAudits的所有访问都包装在synchronized中:

sychronized(this.pendingAudits) {
   this.pendingAudits.addAll(Arrays.asList(audits));

   for (Iterator<Audit> it = this.pendingAudits.iterator(); it.hasNext();) {
       // Do something
       it.remove();
   }
}

最终结果是,在任何给定时间,只有一个线程可以执行同步块。如果频繁执行代码,则可能成为瓶颈。