簡體   English   中英

在多線程環境中遍歷集合:ConcurrentModificationException

[英]Iterate over collection in multithread environment: ConcurrentModificationException

我收到一個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的迭代器迭代器,並且在其他線程可以添加其他審計的同時刪除每個元素。

如何優雅地解決它?

一個快速的解決辦法是換每次訪問this.pendingAuditssynchronized

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

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

最終結果是,在任何給定時間,只有一個線程可以執行同步塊。 如果頻繁執行代碼,則可能成為瓶頸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM