首頁  >  文章  >  Java  >  為什麼即使使用「synchronized」也會出現 ConcurrentModificationException?

為什麼即使使用「synchronized」也會出現 ConcurrentModificationException?

Patricia Arquette
Patricia Arquette原創
2024-11-09 01:56:02206瀏覽

Why Do I Get ConcurrentModificationException Even When Using `synchronized`?

儘管使用 Synchronized,如何獲得 ConcurrentModificationException?

通常認為使用 synchronized 關鍵字可以防止所有並發問題。但是,它只能確保一次有一個執行緒可以存取同步程式碼區塊。它不會阻止對正在迭代的集合進行修改。

考慮以下程式碼:

public synchronized X getAnotherX() {
  if (iterator.hasNext()) {
    X b = iterator.next();
    String name = b.getInputFileName();
    ...
    return b;
  } else {
    return null;
  }
}

synchronized 宣告頭僅確保整個方法由一個執行緒在某個時間執行時間。但是,它並不能阻止迭代器正在存取的集合被其他執行緒修改。

為什麼會發生 ConcurrentModificationException?

ConcurrentModificationException 通常在修改時發生在迭代循環中迭代的集合。例如,以下程式碼將導致此異常:

Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
    Item item = (Item) iterator.next();
    if (item.satisfiesCondition()) {
        collection.remove(item);
    }
}

在這種情況下,您應該使用 iterator.remove() 方法來刪除元素。如果需要新增到集合中,則不能依賴同步方法。但是,如果您正在處理列表,則可以使用 ListIterator 子類型,它提供了 add() 方法。

以上是為什麼即使使用「synchronized」也會出現 ConcurrentModificationException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn