尽管使用 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中文网其他相关文章!