[英]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.pendingAudits
在synchronized
:
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.