首页 > Java > java教程 > 为什么即使使用'synchronized”也会出现 ConcurrentModificationException?

为什么即使使用'synchronized”也会出现 ConcurrentModificationException?

Patricia Arquette
发布: 2024-11-09 01:56:02
原创
287 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板