首页 文章

在mutithread环境中迭代集合:ConcurrentModificationException

提问于
浏览 1144
1

我得到 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 回答

  • 2

    一个快速的解决方案是在 synchronized 中包含对 this.pendingAudits 的每次访问:

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

    净效果是在任何给定时间只有一个线程可以执行同步块 . 如果频繁执行代码,这可能会成为瓶颈 .

相关问题