儘管使用 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中文網其他相關文章!